Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Vista muy lenta (https://www.clubdelphi.com/foros/showthread.php?t=94008)

Critter 18-06-2019 13:07:59

Vista muy lenta
 
Hola compañeros:

Llevo varias semanas dándole vueltas a la siguiente vista y no encuentro la manera de hacer que sea más rápida.
Imagino que el problema esta en la unión de las 2 tablas de CLIENTES y CAMBIOS_CLIENTES, ya que tienen
muchos registros. La idea es traer los registros de los expedientes y el registro de cada cliente para que devuelva
exactamente el estado del cliente en la fecha del expediente.
La lentitud aparece cuando se filtra por el DOI_CLIENTE o CLIENTE, osea, las columnas involucradas en
VERSION_CLIENTE. Por supuesto hay indices para DOI_CLIENTE y CLIENTE. Añadir que el servidor es firebird 2.1.7

Quedo a la espera de vuestra ayuda.

Gracias.

Código SQL [-]

CREATE VIEW VW_SELECCION_EXPEDIENTE (ID, PERIODO, ACTIVO, NUM_EXPTE_SERIE, EXPTE_SERIE, EXPTE_SERIE_ABREV, FECHA_ALTA, ESTADO_ID, ESTADO, IDENTIFICADOR, OPCIONAL, TERMINADO, GESTION_ID, GESTION, GESTION_AMPLIADO, CLIENTE_ID, TRANSMITENTE_ID, PROVEEDOR_ID, DOI_CLIENTE, CLIENTE, DOI_PROVEEDOR, PROVEEDOR, DOI_TRANSMITENTE, TRANSMITENTE, ANCLADO, AS_OBSERVACIONES, ESTADO_COLOR, AS_VINCULOS, AS_TAREAS)
AS            
  WITH VERSION_CLIENTE AS (
    SELECT CLIENTEID AS ID, NIF_CIF, FULL_NAME, FMOD FROM CLIENTES
    UNION ALL
    SELECT CLIENTEID, NIF_CIF, FULL_NAME, FECHA_INSERCION FROM CAMBIOS_CLIENTES
  )
                   
SELECT DISTINCT
  EXPEDIENTES.EXPEDIENTEID,
  EXTRACT(YEAR FROM FECHA),
  EXPEDIENTES.ACTIVO,
  (LPAD(TRIM(EXPEDIENTES.NUMEXPTE), 8, '0') || '/' || LPAD(TRIM(EXPEDIENTES.SERIEEXPTE), 3, '0')) AS NUM_EXPTE_SERIE,
  EXPTE_SERIES.DESCRIPCION AS SERIE,  
  EXPTE_SERIES.ABREV,
  EXPEDIENTES.FECHA,
  EXPEDIENTES.ESTADOID,
  EXPTE_ESTADOS.DESCRIPCION AS ESTADO,
  EXPEDIENTES.IDENTIFICADOR,
  EXPEDIENTES.OPCIONAL,
  EXPEDIENTES.TERMINADO,
  EXPEDIENTES.GESTIONID,
  EXPEDIENTES.GESTION,
  COALESCE('['|| EXPTE_SERIES.ABREV || '] ', '') || EXPEDIENTES.GESTION,    
  EXPEDIENTES.CLIENTEID AS CLIENTEID,
  COALESCE(EXPEDIENTES.TRANSMITENTEID, ''),
  COALESCE(EXPEDIENTES.PROVEEDORID, ''),
  CLIENTE.NIF_CIF AS NIF_CIF_CLIENTE,
  CLIENTE.FULL_NAME AS CLIENTE,
  COALESCE(PROVEEDOR.NIF_CIF, '') AS NIF_CIF_PROVEEDOR,
  COALESCE(PROVEEDOR.FULL_NAME, '') AS PROVEEDOR,
  COALESCE(TRANSMITENTE.NIF_CIF, '') AS NIF_CIF_TRANSMITENTE,
  COALESCE(TRANSMITENTE.FULL_NAME, '') AS TRANSMITENTE,
  EXPEDIENTES.ANCLADO,
  IIF((EXPEDIENTES.OBSERVACIONES IS NULL) OR (TRIM(EXPEDIENTES.OBSERVACIONES)=''), 0,1) AS AS_OBSERVACIONES,
  EXPTE_ESTADOS.COLOR,
  IIF(EXISTS(SELECT EXPTEVINCULADOS.PRINCIPAL FROM EXPTEVINCULADOS WHERE (EXPTEVINCULADOS.PRINCIPAL = EXPEDIENTES.EXPEDIENTEID)), 1, 0) AS AS_VINCULOS,
  IIF(EXISTS(SELECT EXPTE_TAREAS.ID FROM EXPTE_TAREAS WHERE (EXPTE_TAREAS.EXPEDIENTEID = EXPEDIENTES.EXPEDIENTEID)),1, 0) AS AS_TAREAS
  FROM EXPEDIENTES
  
  LEFT JOIN VERSION_CLIENTE CLIENTE ON ((CLIENTE.FMOD <= EXPEDIENTES.FMOD) AND (CLIENTE.ID = EXPEDIENTES.CLIENTEID))
  LEFT JOIN VERSION_CLIENTE PROVEEDOR ON ((PROVEEDOR.FMOD <= EXPEDIENTES.FMOD) AND (PROVEEDOR.ID = EXPEDIENTES.PROVEEDORID))
  LEFT JOIN VERSION_CLIENTE TRANSMITENTE ON ((TRANSMITENTE.FMOD <= EXPEDIENTES.FMOD) AND (TRANSMITENTE.ID = EXPEDIENTES.TRANSMITENTEID))
  
  LEFT JOIN ESTADOSEXPTE EXPTE_ESTADOS ON EXPTE_ESTADOS.ESTADOID = EXPEDIENTES.ESTADOID
  LEFT JOIN EXPTESERIE EXPTE_SERIES ON EXPTE_SERIES.ID = EXPEDIENTES.SERIEEXPTE
  WHERE (EXPEDIENTES.EXPEDIENTEID > 0) AND (EXPEDIENTES.DELETED = 0)
;

Casimiro Notevi 18-06-2019 14:27:07

Es casi imposible poder ayudarte si no tenemos una BD para probar.
De todas formas, deberías ir probando poco a poco, trozo a trozo del código para saber exactamente dónde se produce el problema.
Por ejemplo, todos esos left join, ¿son necesarios? ¿no pueden ser inner join?
Es que, lo dicho al principio, no podemos averiguar, tendríamos que ir dando palos de ciego.

Neftali [Germán.Estévez] 18-06-2019 16:23:43

Sin saber la estructura de las tablas, las claves que tienes definidas, los índices definidos y los datos de cada tabla es difícil saber qué está pasando.
Deberías acceder al PLAN de la consulta con alguna herramienta que te permita consultarlo.
Ahí deberías poder ver qué parte te está ralentizando la consulta.

Habría que saber de qué tipo son los campos DOI_CLIENTE y CLIENTE y los valores diferentes que tienen en la tabla.

No tiene nada que ver que tengas:
* 1.000.000 de registros con 3 valores diferentes.
* 1.000.000 de registros con 900.000 valores diferentes.


La franja horaria es GMT +2. Ahora son las 19:02:34.

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