[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