Rendimiento UNION

10/04/2007 - 09:24 por Alhambra-Eidos Kiquenet | Informe spam
Hola a todos,

tengo esta consulta para Informix. Son 3 UNION.
El caso que al ejecutar la consulta aparece timeout porque tarda mucho. He
descubierto que si pongo
AND (usuario = 'AE2')
en lugar de
AND (lower(usuario) = 'ae2')

mejora bastante el tiempo de ejecución.

Quería saber, para SQL SERVER si se tuviera una consulta de este tipo, qué
se podría hacer para mejorar el tiempo de ejecución ? Quizá la parte de LEFT
JOIN que tengo puede mejorarse de alguna manera ??.

La sintaxis de Informix y SQL SERVER son similares y en parte podría
ayudarme de alguna forma.

Gracias y saludos cordiales.

SELECT
idtareasworkflow, tipotarea, ...mas campos de varias tablas

FROM tareasworkflow t
LEFT JOIN menu_fra mf ON t.tipoval=mf.valor AND mf.fcclave='B36' AND
mf.languaje=1
LEFT JOIN (valoracion v LEFT JOIN direcval dv on v.idvaloracion =
dv.idvaloracion)
on t.idvaloracion = v.idvaloracion
LEFT JOIN tasadorval tv on t.clavetasa = tv.clavetasa and t.idvaloracion =
tv.idvaloracion

WHERE ( tmfinal IS NULL OR tmfinal = '')
AND (lower(usuario) = 'ae2')

UNION
SELECT idtareasworkflow, tipotarea, ...mas campos de varias tablas


FROM tareasworkflow t
LEFT JOIN menu_fra mf ON t.tipoval=mf.valor AND mf.fcclave='B36' AND
mf.languaje=1
LEFT JOIN tasadorval tv on t.clavetasa = tv.clavetasa and t.idvaloracion =
tv.idvaloracion
LEFT JOIN (valoracion v LEFT JOIN direcval dv on v.idvaloracion =
dv.idvaloracion)
on t.idvaloracion = v.idvaloracion
WHERE (tmfinal IS NULL OR tmfinal = '')
AND (lower(iniusuario) = 'ae2')
AND t.tipotarea <> 200

UNION
SELECT
idtareasworkflow, tipotarea, ...mas campos de varias tablas

FROM tareasworkflow t
LEFT JOIN menu_fra mf ON t.tipoval=mf.valor AND mf.fcclave='B36' AND
mf.languaje=1
LEFT JOIN tasadorval tv on t.clavetasa = tv.clavetasa and t.idvaloracion =
tv.idvaloracion
LEFT JOIN (valoracion v LEFT JOIN direcval dv on v.idvaloracion =
dv.idvaloracion) on t.idvaloracion = v.idvaloracion
WHERE ( tmfinal IS NULL OR tmfinal = '')
AND (lower(iniusuario) = 'ae2')
AND t.tipotarea = 200 AND retenido = 1



http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.net
 

Leer las respuestas

#1 Jose Mariano Alvarez
10/04/2007 - 13:40 | Informe spam
En el post ,
DIJO .
Hola a todos,

tengo esta consulta para Informix. Son 3 UNION.
El caso que al ejecutar la consulta aparece timeout porque tarda mucho. He
descubierto que si pongo
AND (usuario = 'AE2')
en lugar de
AND (lower(usuario) = 'ae2')

mejora bastante el tiempo de ejecución.

Quería saber, para SQL SERVER si se tuviera una consulta de este tipo, qué
se podría hacer para mejorar el tiempo de ejecución ? Quizá la parte de LEFT
JOIN que tengo puede mejorarse de alguna manera ??.

La sintaxis de Informix y SQL SERVER son similares y en parte podría
ayudarme de alguna forma.

Gracias y saludos cordiales.

SELECT
idtareasworkflow, tipotarea, ...mas campos de varias tablas

FROM tareasworkflow t
LEFT JOIN menu_fra mf ON t.tipoval=mf.valor AND mf.fcclave='B36' AND
mf.languaje=1
LEFT JOIN (valoracion v LEFT JOIN direcval dv on v.idvaloracion =
dv.idvaloracion)
on t.idvaloracion = v.idvaloracion
LEFT JOIN tasadorval tv on t.clavetasa = tv.clavetasa and t.idvaloracion =
tv.idvaloracion

WHERE ( tmfinal IS NULL OR tmfinal = '')
AND (lower(usuario) = 'ae2')

UNION
SELECT idtareasworkflow, tipotarea, ...mas campos de varias tablas


FROM tareasworkflow t
LEFT JOIN menu_fra mf ON t.tipoval=mf.valor AND mf.fcclave='B36' AND
mf.languaje=1
LEFT JOIN tasadorval tv on t.clavetasa = tv.clavetasa and t.idvaloracion =
tv.idvaloracion
LEFT JOIN (valoracion v LEFT JOIN direcval dv on v.idvaloracion =
dv.idvaloracion)
on t.idvaloracion = v.idvaloracion
WHERE (tmfinal IS NULL OR tmfinal = '')




Tu problema es que cuando usas

"campo condicion Funcion(valor)"

puede tratar de encontrar el valor resultante de aplicar la funcion en
un indice pero cuando usas

"Funcion(campo) condicion valor"

no puede usar un indice porque en el indice no esta el resultado de la
funcion sino el valor del campo.

Condicion es > < = <= etc


Debes cambiar donde se pueda estos predicados para que siempre la
columna quede sola y no aplicada una funcion.


Por que comparas por mayusculas y minusculas?
Normalmente la base de datos se instala insensible a mayusculas y
minusculas.




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)


IMPORTANTE

Por favor traten de indicar la versión de SQL y Service Pack.
La inclusión de (CREATE, INSERTS, etc.) para poder reproducir el
problema también ayuda.

Preguntas similares