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

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
10/04/2007 - 15:32 | Informe spam
Alhambra-Eidos Kiquenet,

Como te has dado cuenta, el operador UNION a veces resulta costoso.

AND (usuario = 'AE2')
en lugar de
AND (lower(usuario) = 'ae2')

mejora bastante el tiempo de ejecución.



No es buena practica manipular una columna que participa en una expresion en
la clausula "where" o en un "join". Como comento Jose Mariano, esto hace que
SQL Server descarte analizar las estadisticas de algun indice, en caso de que
este exista.

Puede que no haya notado algo, pero me parece que las dos ultimas sentencias
son subconjuntos de la primera, por lo que no son necesarias. Basta con
escribir:

select distinct
idtareasworkflow,
tipotarea,
...mas campos de varias tablas
FROM
dbo.tareasworkflow t
LEFT JOIN
dbo.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
(usuario = 'AE2')
go

y obtendras el mismo resultado.


AMB

"Alhambra-Eidos Kiquenet" wrote:

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

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida