Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta lenta (https://www.clubdelphi.com/foros/showthread.php?t=81451)

DamianG 15-11-2012 16:02:58

Consulta lenta
 
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)


Código SQL [-]
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

Cita:

Empezado por DamianG (Mensaje 449583)
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)


Código SQL [-]
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.
Código SQL [-]
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.


La franja horaria es GMT +2. Ahora son las 22:56:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi