Jump to content


Photo

Consulta bastante lenta y no funciona el filtro entre fecha


  • Please log in to reply
6 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 06 December 2012 - 08:30 AM

Pues eso, tengo el siguiente procedimiento:

CREATE OR ALTER PROCEDURE CONSULTA_DESPACHOS (
    ficha varchar(15),
    desde varchar(10),
    hasta varchar(10))
returns (
    sficha varchar(15),
    sconsumidor varchar(150),
    smarca varchar(40),
    smodelo varchar(40),
    splaca varchar(10),
    scolor varchar(25),
    sanio integer,
    sasignadoa varchar(60),
    scombustible varchar(15),
    sasignacion numeric(15,2),
    sfecha date,
    scantidad numeric(15,2),
    stipodesp varchar(5),
    skm integer,
    sdespid integer)
as
BEGIN

        FOR SELECT iif(D.ve_ficha IS NULL, D.ve_ficha, D.desp_placa),
            IIF(D.desp_consnombre = 'CARTA DE RUTA', D.desp_consnombre, DE.DEP_NOMBRE),
            COALESCE(V.VE_MARCA,D.DESP_MARCA),
            COALESCE(V.VE_MODELO,D.DESP_MODELO),
            COALESCE(V.VE_PLACA,D.DESP_PLACA),
            COALESCE(V.VE_COLOR,D.DESP_COLOR),
            COALESCE(V.VE_ANIO,D.DESP_VEHANIO),
            IIF(D.desp_consnombre = 'CARTA DE RUTA', V.ve_asignadoa, D.desp_recibido),
            C.COMB_NOMBRE, A.AS_ASACTUAL, D.DESP_FECHA, COALESCE(D.DESP_CANT,0),
            D.DESP_TIPO, D.DESP_KM, D.DESP_ID FROM DESPACHOS D
            LEFT JOIN VEHICULOS V ON V.ve_id = D.ve_id
            LEFT join ASIGNACION A ON A.ve_id = D.ve_id
            LEFT JOIN COMBUSTIBLES C ON C.comb_id = D.desp_comb
            LEFT JOIN departamentos DE on DE.dep_id = D.desp_consumidor
            WHERE D.ve_ficha NOT IN ('TANQUE') AND D.desp_estado = 1
            AND D.desp_fecha >= :DESDE and D.DESP_FECHA <= :HASTA
            and D.VE_FICHA = :FICHA OR D.desp_placa = :FICHA
            ORDER by D.DESP_FECHA DESC
        INTO :SFICHA, :SCONSUMIDOR, :SMARCA, :SMODELO, :SPLACA, :SCOLOR,
            :SANIO, :SASIGNADOA, :SCOMBUSTIBLE, :SASIGNACION, :SFECHA, :SCANTIDAD, :STIPODESP, :SKM, :SDESPID DO
        BEGIN
            SUSPEND;
        END
END


El objetivo es encontrar despachos tanto por el no. de ficha o por placa del vehículo, hasta ahora todo bien, pero tiene dos problemas:

1) La consulta es bastante lenta, todos los left join tiene su índice creado.
2) Mientras la consulta se hace por una ficha o placa que no esté en el catálogo de vehículos no funciona el filtro entre fechas, me lo muestra todos, más sin embargo, los que sí están en el catálogo sí funciona ese filtro.

¿Hay una mejor forma de hacer esa consulta?.

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 06 December 2012 - 08:36 AM

Porque estás usando

desde VARCHAR(10),
hasta VARCHAR(10))

No deberían de ser del tipo correspondiente, es decir DATE ?

Saludos
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 06 December 2012 - 09:44 AM

Funciona igual tanto como Varchar y date, la diferencia es que los parámetros lo debo pasar con formato 'dd.mm.yyyy'.

Saludos.
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 06 December 2012 - 10:59 AM

Saludos.

Con lo relacionado a la lentitud, ¿Qué plan te arroja el servidor de Firebird?

Una pregunta, ¿Hiciste prueba solo trayendo los datos de la tabla principal (Despacho)?; me explico, realizar el select sin los left join y ver los resultados.

Si sigues sin tener solución, si lo deseas me puedes enviar un backup de la BD para analizarla.

Por cierto, ¿Que versión de Firebird usas?
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 06 December 2012 - 11:52 AM

Pues no sé decirte sobre el PLAN ya que tengo IBExper Personal Edition, la versión de Firebird es 2.5.
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 06 December 2012 - 02:27 PM

Saludos.

Antes que nada, tal como esta utiliza todos los indices adecuados y me respondió bastante rápido la consulta en una VM con un 1Gb de memoria RAM asignada en un Win XP; la PC principal tiene 4 GB RAM, Win 7 64bits Dual Core 2.60 GHZ.  Quizás como no accedo desde la red puede que no vea el delay por el cual te quejas.

Note que con todo y los indices la consulta leía la totalidad de los registros de la tabla DESPACHOS, por lo que agregue un indice:
CREATE INDEX DESPACHOS_IDX5 ON DESPACHOS (VE_FICHA, DESP_FECHA, DESP_PLACA);


Con dicho indice la consulta solo lee los registros necesarios, ahora bien, te recomiendo vigilar el desempeño en las demás operaciones donde este involucrada dicha tabla.

Una observación adicional, el campo VE_FICHA de la tabla DESPACHO es VARCHAR(10) y en la tabla VEHICULOS es VARCHAR(20).
Revisalo!!!!
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 07 December 2012 - 06:15 AM

Vaya, pero ya tenía esos índices por separado, ¿Cual es la diferencia en tenerlos todos juntos en uno solo?, eso sí, eso ahora vuela a match 5 :D.

Sólo quedaría resolver el problema del filtro entre fecha, sólo me funciona a medias, es decir, funciona perfectamente siempre y cuando la ficha o placa esté en el catálogo de vehículos, pero no los que están fuera del mismo (ya sea despachos a vehiculos externos fuera de la institución) el filtro hace caso omiso, ¿por qué será?, ¿será por el left join a la tabla de vehículos?.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.