Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-04-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Como eficientizar este Select ????

Buen día compañeros, tengo un Select que uso para un Reporte de Antiguedad de Saldos por Factura, del cual me obliga revisarlo muy bien, consume muchos recursos al servidor al momento de que alguien genera dicho reporte, aparte que tarda de masiado tiempo ( 10 a 15 mins ) depende del rango de fecha especificado, el reporte muestra aquellos clientes con sus facturas desglosado por X etapa de vigencia de la Factura por ejemplo:

FACTURA FECHA VENCIM Normal 15DIAS 30DIAS ....
CLIENTE : JOSE SANCHEZ

FA-00001 01-12-2007 16-01-2008 0.00 0.00 6,800.00
FA-00002 02-01-2008 18-01-2008 0.00 3,400.00 0.00
FA-00003 04-04-2008 20-01-2008 200.00 0.00 0.00
_______ ________ ________
TOTAL CLIENTE : JOSE SANCHEZ 200.00 3,400.00 6,800.00
...........
Y asi sucesicamente
..............

Tengo el siguiente select:

Código SQL [-]
SELECT V.CLAVE,V.NOMBRE,C.CLIENTE,CC.NOMCLI,C.TIPOMOV||C.FOLIO FOLMOV,C.FECHAMOV,C.FECVENCI, 
//NORMAL
(
FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) - 
FECHAMOV <15 AND FECHAMOV<='31.12.2007' AND CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND 
FOLIO = C.FOLIO AND CVEDOCUM <> 'CREM'
) 
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC 
< 15 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)) 
VNORMAL,

//15 DIAS 
(FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) - 
FECHAMOV >=15 AND CAST('31.12.2007' AS DATE) - FECHAMOV <30 AND CARABO = 1 AND CLIENTE = C.CLIENTE AND 
TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM') 
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=
15 AND CAST('31.12.2007' AS DATE) - FECHAFAC <30 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE 
AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)) V15DIAS,
 
//30 DIAS
(FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) - 
FECHAMOV >=30 AND CAST('31.12.2007' AS DATE) - FECHAMOV <45 AND CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV = 
C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=
30 AND CAST('31.12.2007' AS DATE) - FECHAFAC <45 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE 
AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)) V30DIAS,
..............................
................................
FROM TCXC_CARABO C 
JOIN TCXC_CLIENTES CC ON (CC.NUMCLI = C.CLIENTE) 
JOIN TFAC_VENDGRUPOS V ON (V.CLAVE = CC.CLAVEN) 
WHERE
  CAST('31.12.2007' AS DATE) - C.FECHAMOV >= 0 AND
  C.CARABO = 1 
 
GROUP BY 
......

ORDER BY 
.......

Si ejecuto el Select que señalo no tarda ni 1 seg. en executarse, pero me muestra todos las
facturas de cada cliente en ceros que son las liquidadas, por lo tanto hay que meterle un filtro
ya sea en el Where ó dentro del Having del Group By, lo que hago es lo siguiente, en el Having:

Código SQL [-]
.....
HAVING

//NORMAL
(FUD_ROUND((SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_CARABO 
WHERE CAST('31.12.2007' AS DATE) - FECHAMOV <15 AND FECHAMOV<='31.12.2007' AND CARABO = 1 AND 
CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_DCARABO 
WHERE CAST('31.12.2007' AS DATE) - FECHAFAC <15 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND 
CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)
) <> 0 OR
 
//15 DIAS
(FUD_ROUND((SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_CARABO 
WHERE CAST('31.12.2007' AS DATE) - FECHAMOV >=15 AND CAST('31.12.2007' AS DATE) - FECHAMOV <30 AND 
CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_DCARABO 
WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=15 AND CAST('31.12.2007' AS DATE) - FECHAFAC <30 
AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)
) <> 0 OR
......................
......................

Al agregarle el filtro anterior, para que me muestre solo aquellos registros donde haya facturas pendientes por pagar y esten en el
rango de antiguedad señalado, tarda alrededor de 2 mins por ciertos clientes, hay algunos que tarda 5,10,15 Segs., en realidad
tarda aprox. de 15 a 20 mins, ya intente por meterle algunos INDICES a las tablas relacionadas y si ayuda pero no mucho, ahora
bien, no he llegado a mi pregunta aun , mi pregunta es la siguiente, se podrá en firebird 1.5.5 hacer referencia a un resultado de
un campo calculado en este caso el campo VNORMAL que es producto de 2 select's, tomarlo como referencia en el having para no
volver a ejecturar los 2 Select's por campo, es decir algo asi:

Código SQL [-]
HAVING
   VNORMAL <> 0 OR
   V15DIAS  <> 0 OR
   .............

Ya lo intente asi, pero me marca error que el campo no existe, pero se podrá hacer algo con alguna UDF ???? ó
alguna función que venga con firebird ????

Agradezco mucho cualquier sugerencia al respecto....

Saludos....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King

Última edición por AGAG4 fecha: 29-04-2008 a las 20:35:59. Razón: Corrección
Responder Con Cita
  #2  
Antiguo 29-04-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Has probado a optimizarlo con la ayuda de IBPlanalyzer?, es antiguo pero bastante funcional y útil.
http://cc.codegear.com/Item/16721
Responder Con Cita
  #3  
Antiguo 29-04-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Thumbs up

Gracias casimiro, voy a checar ese programa....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
  #4  
Antiguo 01-05-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
No se si sea muy ignorante ó muy wey, pero la verdad ese programa te da información del tiempo que tarda de preparar y ejecutar el select, te pone una especie de organigrama, donde te pone varias señales, como por ejemplo veo que sale un dibujito de Precaución, Stop, Palomita verde, esto también lo logro ver en el ibexpert, me imaginaba algo como por ejemplo, los posibles indices que sobran de más, algun posible campo que me falta incluir en algun indice que me pudiera servir para agilizar el tiempo, etc. etc. si lo tiene lo veo escondidon....

Gracias por su sugerencia....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
  #5  
Antiguo 01-05-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Imagino que tienes el ibexpert "completo", el de pago, porque esas opciones están deshabilitadas en la versión free, que es la que yo he visto.

Efectivamente, tal y como indicas, con esos códigos de colores te avisan los que están bien y eficientes y los que enlentecen, entonces debes fijarte en esos índices, join, o lo que sea... porque te indica que es ahí donde tarda, debes ir probando alternativas para optimizarlo: otros índices, enlazar tablas en otro orden, poner antes un campo de una tabla u otra, etc. cada caso es muy distinto.

Con esos programas ves el "plan" que usa y debes ir cambiando la sql hasta encontrar que use el mejor plan posible, el que se ejecute más rápido.

Lleva mucho tiempo hacer un sql eficiente, pero es necesario "perder" ese tiempo porque ahí estará la diferencia entre tener un programa lento y pesado a convertirlo en rápido y ágil.
Es un punto muy importante, en la documentación de firebird hay un apartado que hablan exclusivamente de ese tema, con ejemplos (a ver si lo encuentro y te lo paso) y ponen un ejemplo de una sencilla consulta sql que tarda 20 minutos y con un pequeño cambio tarda solo unas milésimas de segundo.
Yo "pierdo" mucho tiempo optimizando una sql que sea lento, para mí lento significa que tarde más de 1 segundo, le doy montones de vueltas, cambios y lo rehago de varias formas hasta encontrar la forma de que sea rápido.

Última edición por Casimiro Notevi fecha: 01-05-2008 a las 13:25:46.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
que esta mal en este FOR SELECT Milperrimo Firebird e Interbase 9 08-10-2007 16:29:28
Enlazar con base de datos este donde este 4-0 C++ Builder 5 12-01-2007 20:33:00
Como Consultar Dia,Mes y Año en Select ???? AGAG4 SQL 1 05-07-2006 17:43:33
¿Como llevar un Select a .TXT? juliopag1 SQL 4 13-01-2006 14:39:15
Como armo este txt???? danytorres Varios 9 06-09-2004 22:29:46


La franja horaria es GMT +2. Ahora son las 12:31:08.


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