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)
;