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

Rodrigo Teodoro teodoro_rodrigo em ig.com.br
Qua Abr 28 10:21:29 -03 2010


Todos os campos tem envolvidos têm índices.
Creio que algo que mudou na versão mais nova, logo, terei que modificar 
as demais consultas complexas no sistema para não ter problema.
Testei também na versão 2.5, mas com mesmo problema da versão 2.1.

Já passaram por isto durante a migração?

Versão 2.0:

Nenhum registro não indexado nas tabelas.

Versão 2.1:

10.144.035 registros não indexados na tabela PrecoProduto,
Nenhum registro não indexado nas demais tabelas


Query

SELECT DISTINCT
     P.CODPRODUTO
FROM
     PRECOPRODUTO P
     JOIN
         (SELECT
             DES.PRIORIDADE,
             ID.CODPRODUTO,
             LD.CODLABORATORIO,
             GD.CODGRUPOSUBSORTIMENTODESCONTO,
             (CASE WHEN (ID.DESCONTO > 0) AND (ID.DESCONTOFINANCEIRO = 
0)  THEN ID.DESCONTO
                   WHEN (ID.DESCONTO = 0) AND (ID.DESCONTOFINANCEIRO > 
0)  THEN ID.DESCONTOFINANCEIRO
                   WHEN (ID.DESCONTO > 0) AND (ID.DESCONTOFINANCEIRO > 
0)  THEN ID.DESCONTO
                   ELSE -1 END
             ) AS DESCITEM,
             (CASE WHEN (LD.DESCONTO > 0) AND (LD.DESCONTOFINANCEIRO = 
0)  THEN LD.DESCONTO
                  WHEN (LD.DESCONTO = 0) AND (LD.DESCONTOFINANCEIRO > 0) 
  THEN LD.DESCONTOFINANCEIRO
                  WHEN (LD.DESCONTO > 0) AND (LD.DESCONTOFINANCEIRO > 0) 
  THEN LD.DESCONTO
                  ELSE -1 END
             ) AS DESCLAB,
             (CASE WHEN (GD.DESCONTO > 0) AND (GD.DESCONTOFINANCEIRO = 
0)  THEN GD.DESCONTO
                   WHEN (GD.DESCONTO = 0) AND (GD.DESCONTOFINANCEIRO > 
0)  THEN GD.DESCONTOFINANCEIRO
                   WHEN (GD.DESCONTO > 0) AND (GD.DESCONTOFINANCEIRO > 
0)  THEN GD.DESCONTO
                   ELSE -1 END
             ) AS DESCGRUPO
         FROM
             (SELECT
                 D.CODDESCONTO,
                 D.PRIORIDADE,
                 D.GRANULARIDADE
             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')
               )
             ORDER BY D.PRIORIDADE DESC
             ) DES LEFT JOIN ITEMDESCONTO ID ON 
(DES.CODDESCONTO=ID.CODDESCONTO)
                   LEFT JOIN LABORATORIODESCONTO LD ON 
(DES.CODDESCONTO=LD.CODDESCONTO)
                   LEFT JOIN GRUPOSUBSORTIMENTODESCONTO GD ON 
(DES.CODDESCONTO=GD.CODDESCONTO)
         ) DESCONTOS ON (
             (P.CODPRODUTO = DESCONTOS.CODPRODUTO AND DESCONTOS.DESCITEM 
 > 0) OR
             (P.CODLABORATORIO = DESCONTOS.CODLABORATORIO AND 
DESCONTOS.DESCLAB > 0) OR
             (P.GRUPOSUBSORTIMENTO = 
DESCONTOS.CODGRUPOSUBSORTIMENTODESCONTO AND DESCONTOS.DESCGRUPO > 0)
         )
ORDER BY P.CODPRODUTO ASC


Versão 2.0.3

Plano
PLAN SORT (JOIN (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DES CF INDEX 
(FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DES PD INDEX 
(FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DES D INDEX (RDB$PRIMARY16), 
DESCONTOS DES F INDEX (RDB$PRIMARY22))), DESCONTOS ID INDEX 
(RDB$FOREIGN66)), DESCONTOS LD INDEX (FKDESCONTO_LABORATORIODESC)), 
DESCONTOS GD INDEX (GRPSUBSORTDESCONTO_DESCONTO)), P INDEX 
(PRECOPRODUTO_CODPRODUTO, PRECOPRODUTO_CODLABORATORIO, 
PRECOPRODUTO_GRUPOSUBSORT)))

Plano Adaptado
PLAN SORT (JOIN (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DES CF INDEX 
(FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DES PD INDEX 
(FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DES D INDEX (INTEG_478), 
DESCONTOS DES F INDEX (INTEG_484))), DESCONTOS ID INDEX (INTEG_528)), 
DESCONTOS LD INDEX (FKDESCONTO_LABORATORIODESC)), DESCONTOS GD INDEX 
(GRPSUBSORTDESCONTO_DESCONTO)), P INDEX (PRECOPRODUTO_CODPRODUTO, 
PRECOPRODUTO_CODLABORATORIO, PRECOPRODUTO_GRUPOSUBSORT)))

------ Info. Desempenho ------
Tempo de Preparação = 0ms
Tempo de Execução = 266ms
Tempo Médio Leitura = 7,60 ms
Memória Actual = 720.612
Memória Max = 738.252
Buffers de Memória = 2.048
Leituras do disco para a Memória Intermédia = 904
Escritas da Memória Intermédia para o disco = 0
Leituras da Memória Intermédia = 120.044


Versão 2.1

Plano
PLAN SORT (JOIN (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DES CF INDEX 
(FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DES F INDEX (RDB$PRIMARY22), 
DESCONTOS DES PD INDEX (FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DES D 
INDEX (RDB$PRIMARY16))), DESCONTOS ID INDEX (RDB$FOREIGN66)), DESCONTOS 
LD INDEX (FKDESCONTO_LABORATORIODESC)), DESCONTOS GD INDEX 
(GRPSUBSORTDESCONTO_DESCONTO)), P NATURAL))

Plano Adaptado
PLAN SORT (JOIN (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DES CF INDEX 
(FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DES F INDEX (INTEG_484), 
DESCONTOS DES PD INDEX (FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DES D 
INDEX (INTEG_478))), DESCONTOS ID INDEX (INTEG_528)), DESCONTOS LD INDEX 
(FKDESCONTO_LABORATORIODESC)), DESCONTOS GD INDEX 
(GRPSUBSORTDESCONTO_DESCONTO)), P NATURAL))

------ Info. Desempenho ------
Tempo de Preparação = 0ms
Tempo de Execução = 1m 7s 407ms
Tempo Médio Leitura = 1.925,91 ms
Memória Actual = 9.264.500
Memória Max = 11.695.416
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 = 21.419.613


Só para curiosidade, modifiquei a consulta acima até funcionar de 
maneira adequada na versão 2.1, mas achei estranho e fiquei na dúvida se 
seria algum bug. Abaixo os dados da consulta agora com bom desempenho:

SELECT DISTINCT
     P.CODPRODUTO
FROM
     PRECOPRODUTO P,
     (SELECT DISTINCT
         ID.CODPRODUTO,
         LD.CODLABORATORIO,
         GD.GRUPOSUBSORTIMENTO
     FROM
         (SELECT
             D.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 'AMULETO') OR 
(UPPER(F.DESCRICAO) CONTAINING 'DIA D')
           )
           ORDER BY D.PRIORIDADE DESC
         ) AS DESCONTOS
             LEFT JOIN ITEMDESCONTO ID               ON 
(DESCONTOS.CODDESCONTO = ID.CODDESCONTO AND
                                                        (ID.DESCONTO > 0 
OR ID.DESCONTOFINANCEIRO > 0))
             LEFT JOIN LABORATORIODESCONTO LD        ON 
(DESCONTOS.CODDESCONTO = LD.CODDESCONTO AND
                                                        (LD.DESCONTO > 0 
OR LD.DESCONTOFINANCEIRO > 0))
             LEFT JOIN GRUPOSUBSORTIMENTODESCONTO GD ON 
(DESCONTOS.CODDESCONTO = GD.CODDESCONTO AND
                                                        (GD.DESCONTO > 0 
OR GD.DESCONTOFINANCEIRO > 0))
     WHERE
         NOT ID.CODPRODUTO           IS NULL OR
         NOT LD.CODLABORATORIO       IS NULL OR
         NOT GD.GRUPOSUBSORTIMENTO   IS NULL
     ) AS DESCONTOS
WHERE
     P.CODPRODUTO            = DESCONTOS.CODPRODUTO OR
     P.CODLABORATORIO        = DESCONTOS.CODLABORATORIO OR
     P.GRUPOSUBSORTIMENTO    = DESCONTOS.GRUPOSUBSORTIMENTO
ORDER BY
     P.CODPRODUTO ASC

Plano
PLAN SORT (JOIN (SORT (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DESCONTOS 
CF INDEX (FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DESCONTOS F INDEX 
(RDB$PRIMARY22), DESCONTOS DESCONTOS PD INDEX 
(FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DESCONTOS D INDEX 
(RDB$PRIMARY16))), DESCONTOS ID INDEX (RDB$FOREIGN66)), DESCONTOS LD 
INDEX (FKDESCONTO_LABORATORIODESC)), DESCONTOS GD INDEX 
(GRPSUBSORTDESCONTO_DESCONTO))), P INDEX (PRECOPRODUTO_CODPRODUTO, 
PRECOPRODUTO_CODLABORATORIO, PRECOPRODUTO_GRUPOSUBSORT)))

Plano Adaptado
PLAN SORT (JOIN (SORT (JOIN (JOIN (JOIN (SORT (JOIN (DESCONTOS DESCONTOS 
CF INDEX (FKCLIENTE_CLIENTEFORMADECOMPRA), DESCONTOS DESCONTOS F INDEX 
(INTEG_484), DESCONTOS DESCONTOS PD INDEX 
(FKFORMADECOMPRA_PESQDESCONTO), DESCONTOS DESCONTOS D INDEX 
(INTEG_478))), DESCONTOS ID INDEX (INTEG_528)), DESCONTOS LD INDEX 
(FKDESCONTO_LABORATORIODESC)), DESCONTOS GD INDEX 
(GRPSUBSORTDESCONTO_DESCONTO))), P INDEX (PRECOPRODUTO_CODPRODUTO, 
PRECOPRODUTO_CODLABORATORIO, PRECOPRODUTO_GRUPOSUBSORT)))

------ Info. Desempenho ------
Tempo de Preparação = 0ms
Tempo de Execução = 31ms
Tempo Médio Leitura = 0,89 ms
Memória Actual = 9.181.996
Memória Max = 11.665.512
Buffers de Memória = 2.048
Leituras do disco para a Memória Intermédia = 16
Escritas da Memória Intermédia para o disco = 0
Leituras da Memória Intermédia = 12.586





Mais detalhes sobre a lista de discussão lista