PDA

Ver la Versión Completa : Consulta lenta


DamianG
15-11-2012, 16:02:58
Hola a todos, me podran comentar si la siguiente consulta la ven bien realizada? Porque a traves de distintos test me da que es lenta la misma.

Son 2 tablas en cuestion

NOMENCLADOR (CODIGO Y DESCRIPCION) ----------------CLAVE PRIMARIA (CODIGO)
VALORES (CODIGO, PRECIO, CODIGO_OBRASOCIAL) ------ (INDICE SOBRE CODIGO)


select nomenclador.codido, nomenclador.descri, valores.precio from nomenclador

left join valores on valores.codigo = nomenclador.codigo and valores.codigo_obracial = '40'

where nomenclador.tipo = 'M'

order by nomenclador.descri

Muchas gracias

Neftali [Germán.Estévez]
15-11-2012, 18:53:54
Habría que saber de qué tipo son los código.
Lo mejor sería tener el PLAN de ejecución de la consulta para saber qué está pasando.
De cuantos registros por tabla hablamos.
¿Esto "and valores.codigo_obracial = '40'" no debería estar en el WHERE?
Sabiendo cuantos registros salen del la JOIN, luego habría que ver si se filtra por TIPO, cómo de eficiente es eso, y al ordenar por DESCRI, cómo de eficiente es eso.


Vamos, que sin más información, no se puede saber...

DamianG
15-11-2012, 20:52:32
Habría que saber de qué tipo son los código.CODIGO: TIPO VARCHAR(15)


Lo mejor sería tener el PLAN de ejecución de la consulta para saber qué está pasando.PLAN


NOMENCLADOR ORDER "DESCRI" INDEX ("TIPO"),

VALORES INDEX ("CODIGO", "CODIGO_OBRASOCIAL")


De cuantos registros por tabla hablamos.NOMENCLADOR 2830 REG. VALORES 10500 REG.

Casimiro Notevi
15-11-2012, 22:29:36
Deberías tener un código integer como clave primaria en ambas tablas, además una clave foránea en 'valores' enlazando a 'nomenclator'.
Eso independientemente del campo varchar(15) que tienes, que también debería ser clave foránea en 'valores'.

Aparte, esa consulta sql no está muy bien hecha, tal y como te han aconsejado antes.
Aunque sin más detalle, es difícil aconsejar.

cointec
16-11-2012, 08:19:50
Tienes índices por nomenclator.tipo?
Y por nomenclator.descripcio?

Has probado los tiempos quitando el order by?

olbeup
16-11-2012, 08:46:34
Hola a todos, me podran comentar si la siguiente consulta la ven bien realizada? Porque a traves de distintos test me da que es lenta la misma.

Son 2 tablas en cuestion

NOMENCLADOR (CODIGO Y DESCRIPCION) ----------------CLAVE PRIMARIA (CODIGO)
VALORES (CODIGO, PRECIO, CODIGO_OBRASOCIAL) ------ (INDICE SOBRE CODIGO)


select nomenclador.codido, nomenclador.descri, valores.precio from nomenclador

left join valores on valores.codigo = nomenclador.codigo and valores.codigo_obracial = '40'

where nomenclador.tipo = 'M'

order by nomenclador.descri

Muchas gracias
Como bien te han comentado Neftali y Casimiro Notevi, el AND Valores.CODIGO_OBRACIAL, según comentas al principio tienes un error en Valores.CODIGO_OBRACIAL tendría que ser Valores.CODIGO_OBRASOCIAL, respecto a la SQL deveria de utilizar ALIAS es más cómodo y libre de posibles errores.
SELECT
N.CODIGO
,N.DESCRI
,V.PRECIO
FROM Nomenclador AS N
LEFT JOIN Valores AS V
ON V.CODIGO = N.CODIGO
WHERE N.TIPO = 'M'
AND V.CODIGO_OBRASOCIAL = '40'
ORDER BY N.DESCRI

Un saludo.

DamianG
20-11-2012, 14:06:16
Les comento, si el filtro "v.codigo_obrasocial = 40" lo saco del left join, hay valores que no me los da cuando no existe en la tabla de valores.

Por ej. tengo el codigo 600 que es VARIOS, por lo tanto no tiene ningun valor en la tabla de valores. Al trasladar el filtro como ustedes dicen el codigo 600 no aparece en la consulta, si lo dejo en el LEFT JOIN si.

Muchas gracias por sus respuestas.