[firebase-br] Select muito demorado.
Reinaldo Cesar
diasmartins em gmail.com
Qui Jul 23 14:42:08 -03 2009
Douglas, conforme vc falou:
CREATE VIEW VW_RECIBOS_MENSAGEIROS(
DOACOD,
MENCOD,
RECNUM,
RECDDD,
RECTEL,
RECSTA,
RECSTAANT,
RECULTENTDIA,
RECULTACUDIA,
RECVALTOT,
RECVALDIN,
RECVALCHQIME,
RECVALCHQPRE,
RECLOCCAN,
RECDATBAICAN,
RECDATULTMOV,
RECDATULTMOVANT)
AS
SELECT
RE1.DOACOD,
RE1.MENCOD,
RE1.RECNUM,
RE1.RECDDD,
RE1.RECTEL,
RE1.RECSTA,
RE1.RECSTAANT,
RE1.RECULTENTDIA,
RE1.RECULTACUDIA,
RE1.RECVALTOT,
RE1.RECVALDIN,
RE1.RECVALCHQIME,
RE1.RECVALCHQPRE,
RE1.RECLOCCAN,
RE1.RECDATBAICAN,
RE1.RECDATULTMOV,
RE1.RECDATULTMOVANT
FROM
RECIBOS RE1
UNION ALL
SELECT
RE2.DOACOD,
RE2.MENCODTRA,
RE2.RECNUM,
RE2.RECDDD,
RE2.RECTEL,
CAST('MR' AS VARCHAR(2)),
CAST(NULL AS VARCHAR(2)),
RE2.RECDATDIATRA,
RE2.RECDATACUTRA,
RE2.RECVALTOT,
CAST(0 AS NUMERIC(10,2)),
CAST(0 AS NUMERIC(10,2)),
CAST(0 AS NUMERIC(10,2)),
CAST(NULL AS VARCHAR(1)),
CAST(NULL AS DATE),
CAST(NULL AS DATE),
CAST(NULL AS DATE)
FROM
RECIBOS RE2
WHERE
RE2.MENCODTRA IS NOT NULL
*** NÃO SEI SE FICARA MELHOR USANDO CASE
(NO MENCOD E MENCODTRA AO INVEZ DO UNION ***
------------------------------------------------------------------------------------------
INDICES
PK_RECIBOS PRIMARY KEY (RECNUM);
FK_DOA_REC_CATCOD FOREIGN KEY (CATCOD) REFERENCES CATEGORIAS
(CATCOD);
FK_DOA_REC_DOACOD FOREIGN KEY (DOACOD) REFERENCES DOADORES (DOACOD);
FK_MEN_REC_MENCOD FOREIGN KEY (MENCOD) REFERENCES MENSAGEIROS
(MENCOD);
FK_MOT_REC_MOTCOD FOREIGN KEY (MOTCOD) REFERENCES MOTIVOS (MOTCOD);
FK_OPE_REC_OPECODDOA FOREIGN KEY (OPECODDOA) REFERENCES OPERADORES
(OPECOD);
FK_OPE_REC_OPECODGRA FOREIGN KEY (OPECODGRA) REFERENCES OPERADORES
(OPECOD);
FK_RUA_REC_RUACOD FOREIGN KEY (RUACOD) REFERENCES RUAS (RUACOD);
FK_SUP_REC_SUPCOD FOREIGN KEY (SUPCOD) REFERENCES SUPERVISORES
(SUPCOD);
FK_TUR_REC_TURCOD FOREIGN KEY (TURCOD) REFERENCES TURNOS (TURCOD);
FK_USU_REC_USUCONC FOREIGN KEY (RECUSUCONC) REFERENCES USUARIOS (USUCOD);
IDX_RECDATBAICAN ON RECIBOS (RECDATBAICAN);
IDX_RECIBOS_MENTRA ON RECIBOS (MENCODTRA, RECDATDIATRA, RECDATACUTRA);
IDX_RECNUMLOT ON RECIBOS (RECNUMLOT);
IDX_RECSEQ ON RECIBOS (RECSEQ);
------------------------------------------------------------------------------------------
INSTRUÇÃO SQL
SELECT
*
FROM
VW_RECIBOS_MENSAGEIROS REC
WHERE
(REC.MENCOD <> 0) AND
(REC.MENCOD IS NOT NULL) AND
(REC.RECSTA <> 'CI') AND
(
(REC.RECSTA IN ('BX','CA') AND (REC.RECLOCCAN <> 'C' OR REC.RECLOCCAN IS
NULL) AND REC.RECDATBAICAN = :DATA)
OR
(REC.RECSTA IN ('CD','DK','OC') AND REC.RECDATULTMOV = :DATA)
OR
(REC.RECSTA = 'CK' AND REC.RECSTAANT = 'OC' AND REC.RECDATULTMOVANT =
:DATA)
OR (REC.RECSTA = 'MR'
AND
(REC.RECULTENTDIA <= :DATA OR REC.RECULTACUDIA <= :DATA))
)
ORDER BY
REC.MENCOD
--======================
Plano de execução
PLAN SORT ((REC RE1 NATURAL)
PLAN (REC RE2 NATURAL))
Adapted Plan
PLAN SORT ((REC RE1 NATURAL) PLAN (REC RE2 NATURAL))
Douglas Tosi escreveu:
> 2009/7/23 Reinaldo Cesar <diasmartins-Re5JQEeQqe8AvxtiuMwx3w em public.gmane.org>:
>> Só que o Select é meio "genérico" pois tem que filtrar praticamente boa
>> parte da minha tabela, porém o que achei estranho é que no firebird 1.5 esse
>> select demorava 4,5 minutos e no Firebird 2.0 passou para 17 minutos.
>
> Manda pra gente o código da view e os índices já existentes nas
> tabelas envolvidas.
>
>
Mais detalhes sobre a lista de discussão lista