Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > SQL
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 16/07/2003
raul_sal raul_sal is offline
No confirmado
 
Join Date: May 2003
Location: 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.
Reply With Quote
  #2  
Old 16/07/2003
guillotmarc's Avatar
guillotmarc guillotmarc is offline
Miembro
 
Join Date: May 2003
Location: Huelva
Posts: 2,638
Poder: 26
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 :

Code:
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).
Reply With Quote
  #3  
Old 17/07/2003
Aprendiz Aprendiz is offline
Miembro
 
Join Date: May 2003
Posts: 78
Poder: 24
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.
Reply With Quote
  #4  
Old 18/07/2003
raul_sal raul_sal is offline
No confirmado
 
Join Date: May 2003
Location: 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
Reply With Quote
  #5  
Old 19/07/2003
raul_sal raul_sal is offline
No confirmado
 
Join Date: May 2003
Location: 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
Reply With Quote
  #6  
Old 19/07/2003
guillotmarc's Avatar
guillotmarc guillotmarc is offline
Miembro
 
Join Date: May 2003
Location: Huelva
Posts: 2,638
Poder: 26
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).

Last edited by guillotmarc : 19/07/2003 at 21:41.
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 00:10.


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