Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2003
raul_sal raul_sal is offline
No confirmado
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 45
Poder: 0
raul_sal Va por buen camino
Consulta Selectiva sobre Store Procedure

Que tal amigos del Foro, tengo este pequeño problema

Tengo un SP en el cual genero una consulta algo compleja, dentro de la cual uno 2 tablas de unos 1700 registros cada una con un INNER JOIN, hasta aqui todo bien, resulta que 2 campos que necesito en la consulta los extraigo de otras 2 tablas tambien master/detail las cuales tienen aproximadamente (170,000, y 370,000) respectivamente, pues para no cansarlos,
hago esto

SELECT *
FROM INV_REP_INVENTARIO_FECHA('NOW')

y la ejecuta en unos 200ms

pero si hago esto

SELECT EXISTENCIA
FROM INV_REP_INVENTARIO_FECHA('NOW')
WHERE PRODUCTO = '010001'

tarda como 35000ms

que puede estar pasando, ya revise los indices con el PLANalyzer y nada que no se que puedo hacer

Gracias.
Responder Con Cita
  #2  
Antiguo 16-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

Añade un parámetro al procedimiento almacenado. De esta forma la consulta se optimizará dentro del procedimiento almacenado.

Como probablemente ese parámetro es optativo, o sea que a veces vas a querer el resultado sin que sea tenido en cuenta, yo suelo construir las consultas dentro del procedmiento, con condiciones en el where, de este tipo :

Código:
select ****
from ***
where ***** and
           (:PRODUCTO is null or PRODUCTO = :PRODUCTO)
De esta forma, si dejas a Null el valor del parámetro, no lo tendrá en cuenta en la consulta.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 17-07-2003
Aprendiz Aprendiz is offline
Miembro
 
Registrado: may 2003
Posts: 78
Poder: 21
Aprendiz Va por buen camino
Si utilizas interbase te diría que jugases un poco con la clausula PLAN JOIN de la SELECT, de esta manera fuerzas tu el proceso de selección y ordenación con lo que puedes obtener o afinar los resultados.

Saludos
__________________
[Aprendiz]: Por que siempre hay algo nuevo que aprender.
Responder Con Cita
  #4  
Antiguo 18-07-2003
raul_sal raul_sal is offline
No confirmado
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 45
Poder: 0
raul_sal Va por buen camino
Gracias por contestar

La solucion temporal que utilice fue crear una tabla a partir de mi StoreProcedure y de ahi todo bien, el problema es que paso todos los registros de la consulta del SP a la tabla y en algunos casos esto puede llegar a tardar un par de minutos.

Siguiendo la sugerencia de Guillotmarc voy a probar agregarle los parametros de busqueda para ver si mejora en algo el rendimiento.

Gracias, ya les contare como me fue
Responder Con Cita
  #5  
Antiguo 19-07-2003
raul_sal raul_sal is offline
No confirmado
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 45
Poder: 0
raul_sal Va por buen camino
Que tal amigos, les cuento que probe la solucion que me dio Guillotmarc y me funciono a la perfeccion, excepto que cuando utilizo esta sentencia

AND ((:V_CLASIFICADOR IS NULL) OR (RTRIM(C.CLASIFICADOR) LIKE :V_CLASIFICADOR))


No me funciona cuando paso el parametro (V_CLASIFICADOR = '01%'), pero si lo coloco directamente si que puede estar pasando



Gracias
Responder Con Cita
  #6  
Antiguo 19-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

No sé que puede estar mal en tu consulta (a primera vista parece que todo esté bien). Aunque te aconsejo de cambiar la condición por :

and (:V_CLASIFICADOR is null or C.CLASIFICADOR starting with :V_CLASIFICADOR)

Ahora en el parámetro debes poner '01' en lugar de '01%'.

La razón de que prefiera esta sintaxis, es porqué Interbase/Firebird podrá aprovechar un índice sobre el campo V_CLASIFICADOR en caso que exista. Cosa que no podía hacer con el Like.

Nota: Tanto si usas el Like o el Starting with, el RTrim que haces no es necesario. Puesto que tu comparas el inicio de cadena del campo, y es indiferente si detrás hay espacios en blanco o no. (Y solo por el hecho de poner el RTrim probablemente ya estés impidiendo que se optimize la consulta con un índice).

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 19-07-2003 a las 21:41:02.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:03:46.


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
Copyright 1996-2007 Club Delphi