Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta Selectiva sobre Store Procedure (https://www.clubdelphi.com/foros/showthread.php?t=2279)

raul_sal 16-07-2003 18:56:54

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.

guillotmarc 16-07-2003 21:23:34

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.

Aprendiz 17-07-2003 11:35:07

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

raul_sal 18-07-2003 06:01:13

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

raul_sal 19-07-2003 09:13:01

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

guillotmarc 19-07-2003 21:35:37

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.


La franja horaria es GMT +2. Ahora son las 05:23:30.

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