[firebase-br] Problemas com desempenho em query na versão 2.1

Rodrigo Teodoro teodoro_rodrigo em ig.com.br
Qua Abr 28 11:52:58 -03 2010


Douglas, não conhecia a CTE até você comentar.

Li a documentação e uma apresentação do Vlad Khorsun e implementei como 
abaixo. Porém teve um desempenho pior que a query modificada, gerando 8 
mil registros não indexados na tabela de PrecoProduto.

No caso, acho que migrar para o Firebird 2.1 agora não compensa, já que 
está tendo desempenho pior que o 2.0 com minha aplicação, já que 
atualizar os clientes, significa mandar a versão 2.1  do firebird e 
muitas querys na minha aplicação.

Achei CTE muito bacana, deixa a query mais organizada e resolve algumas
situações complicadas, inclusive a questão da recursividade.

Muito obrigado a todos pelas dicas!

Segue só por curiosidade a CTE que fiz.

WITH
     DESCONTOS (CODDESCONTO) AS
     (SELECT
         D.CODDESCONTO AS CODDESCONTO
     FROM
         DESCONTO D,
         FORMADECOMPRA F,
         PESQUISADESCONTO PD,
         CLIENTEFORMADECOMPRA CF
     WHERE
       D.CODDESCONTO = PD.CODDESCONTO AND
       PD.CODFORMADECOMPRA = F.CODFORMADECOMPRA                  AND
       (NOT F.CODFORMADECOMPRAFORNEC LIKE :I_CODFORMADECOMPRAFORNEC || 
'_%') AND
       CF.CODFORMADECOMPRA = F.CODFORMADECOMPRA AND
       CF.CODCLIENTE = :I_CODCLIENTE AND
       (
         (UPPER(F.DESCRICAO) CONTAINING 'AM') OR (UPPER(F.DESCRICAO) 
CONTAINING 'DIA')
       )
     ),
     DESC_ITEM (CODPRODUTO) AS
     (SELECT DISTINCT
         ID.CODPRODUTO  AS CODPRODUTO
     FROM
         DESCONTOS
             JOIN ITEMDESCONTO ID           ON  (DESCONTOS.CODDESCONTO = 
ID.CODDESCONTO AND
                                                     (ID.DESCONTO > 0 OR 
ID.DESCONTOFINANCEIRO > 0))
     ),
     DESC_LAB (CODLABORATORIO) AS
     (SELECT DISTINCT
         LD.CODLABORATORIO AS CODLABORATORIO
     FROM
        DESCONTOS
             JOIN LABORATORIODESCONTO LD    ON (DESCONTOS.CODDESCONTO = 
LD.CODDESCONTO AND
                                                    (LD.DESCONTO > 0 OR 
LD.DESCONTOFINANCEIRO > 0))
     ),
     DESC_GRUPO (GRUPOSUBSORTIMENTO) AS
     (SELECT DISTINCT
         GD.GRUPOSUBSORTIMENTO AS GRUPOSUBSORTIMENTO
     FROM
        DESCONTOS
             JOIN GRUPOSUBSORTIMENTODESCONTO GD ON 
(DESCONTOS.CODDESCONTO = GD.CODDESCONTO AND
                                                        (GD.DESCONTO > 0 
OR GD.DESCONTOFINANCEIRO > 0))
     ),
     PRODUTOS (CODPRODUTO) AS
     (SELECT
         P.CODPRODUTO
      FROM
         PRECOPRODUTO P
         LEFT JOIN
             DESC_ITEM ON (DESC_ITEM.CODPRODUTO = P.CODPRODUTO)
         LEFT JOIN
             DESC_LAB ON (DESC_LAB.CODLABORATORIO = P.CODLABORATORIO)
         LEFT JOIN
             DESC_GRUPO ON (DESC_GRUPO.GRUPOSUBSORTIMENTO = 
P.GRUPOSUBSORTIMENTO)
      WHERE
         NOT DESC_ITEM.CODPRODUTO            IS NULL OR
         NOT DESC_LAB.CODLABORATORIO         IS NULL OR
         NOT DESC_GRUPO.GRUPOSUBSORTIMENTO   IS NULL
     )

SELECT
     DISTINCT
     CODPRODUTO
FROM
     PRODUTOS
ORDER BY
     CODPRODUTO ASC



Plano
PLAN SORT (JOIN (JOIN (JOIN (PRODUTOS P NATURAL, SORT (JOIN (JOIN 
(PRODUTOS DESC_ITEM ID INDEX (FKPRODUTO_ITEMDESCONTO), JOIN (PRODUTOS 
DESC_ITEM DESCONTOS D INDEX (RDB$PRIMARY16), PRODUTOS DESC_ITEM 
DESCONTOS PD INDEX (FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS 
DESC_ITEM DESCONTOS F INDEX (RDB$PRIMARY22), PRODUTOS DESC_ITEM 
DESCONTOS CF INDEX (FKCLIENTEFORMADECOMPRA_FORMCOM, 
FKCLIENTE_CLIENTEFORMADECOMPRA))))), SORT (JOIN (JOIN (PRODUTOS DESC_LAB 
LD INDEX (FKLABORATORIO_LABORATORIODESC), JOIN (PRODUTOS DESC_LAB 
DESCONTOS D INDEX (RDB$PRIMARY16), PRODUTOS DESC_LAB DESCONTOS PD INDEX 
(FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS DESC_LAB DESCONTOS F INDEX 
(RDB$PRIMARY22), PRODUTOS DESC_LAB DESCONTOS CF INDEX 
(FKCLIENTEFORMADECOMPRA_FORMCOM, FKCLIENTE_CLIENTEFORMADECOMPRA))))), 
SORT (JOIN (JOIN (PRODUTOS DESC_GRUPO GD INDEX 
(GRPOSUBSORTIMENTO_GRUPO), JOIN (PRODUTOS DESC_GRUPO DESCONTOS D INDEX 
(RDB$PRIMARY16), PRODUTOS DESC_GRUPO DESCONTOS PD INDEX 
(FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS DESC_GRUPO DESCONTOS F 
INDEX (RDB$PRIMARY22), PRODUTOS DESC_GRUPO DESCONTOS CF INDEX 
(FKCLIENTEFORMADECOMPRA_FORMCOM, FKCLIENTE_CLIENTEFORMADECOMPRA))))))

Plano Adaptado
PLAN SORT (JOIN (JOIN (JOIN (PRODUTOS P NATURAL, SORT (JOIN (JOIN 
(PRODUTOS DESC_ITEM ID INDEX (FKPRODUTO_ITEMDESCONTO), JOIN (PRODUTOS 
DESC_ITEM DESCONTOS D INDEX (INTEG_478), PRODUTOS DESC_ITEM DESCONTOS PD 
INDEX (FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS DESC_ITEM DESCONTOS F 
INDEX (INTEG_484), PRODUTOS DESC_ITEM DESCONTOS CF INDEX 
(FKCLIENTEFORMADECOMPRA_FORMCOM, FKCLIENTE_CLIENTEFORMADECOMPRA))))), 
SORT (JOIN (JOIN (PRODUTOS DESC_LAB LD INDEX 
(FKLABORATORIO_LABORATORIODESC), JOIN (PRODUTOS DESC_LAB DESCONTOS D 
INDEX (INTEG_478), PRODUTOS DESC_LAB DESCONTOS PD INDEX 
(FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS DESC_LAB DESCONTOS F INDEX 
(INTEG_484), PRODUTOS DESC_LAB DESCONTOS CF INDEX 
(FKCLIENTEFORMADECOMPRA_FORMCOM, FKCLIENTE_CLIENTEFORMADECOMPRA))))), 
SORT (JOIN (JOIN (PRODUTOS DESC_GRUPO GD INDEX 
(GRPOSUBSORTIMENTO_GRUPO), JOIN (PRODUTOS DESC_GRUPO DESCONTOS D INDEX 
(INTEG_478), PRODUTOS DESC_GRUPO DESCONTOS PD INDEX 
(FK_PESQUISADESCONTO_DESC))), JOIN (PRODUTOS DESC_GRUPO DESCONTOS F 
INDEX (INTEG_484), PRODUTOS DESC_GRUPO DESCONTOS CF INDEX 
(FKCLIENTEFORMADECOMPRA_FORMCOM, FKCLIENTE_CLIENTEFORMADECOMPRA))))))

------ Info. Desempenho ------
Tempo de Preparação = 0ms
Tempo de Execução = 3s 78ms
Tempo Médio Leitura = 87,94 ms
Memória Actual = 9.281.556
Memória Max = 11.727.604
Buffers de Memória = 2.048
Leituras do disco para a Memória Intermédia = 0
Escritas da Memória Intermédia para o disco = 0
Leituras da Memória Intermédia = 809.040





Mais detalhes sobre a lista de discussão lista