Retardo em consulta SQL com select e subselect

3 respostas
Andre_Rosa

Bom dia!

Tenho um script SQL relativamente simples para consulta, que usa um select e um subselect mas, no entanto, ele está com um retardo enorme. O código é esse:

select P.COD_BARRAS, P.classfiscal as NCM, P.nm_produto, P.unidade, COD_BARRAS as EAN, coalesce(P.ipi, 0) as IPI, P.ecf_aliquota, P.substtributaria FROM PRODUTOS P WHERE CD_PRODUTO IN (SELECT CD_PRODUTO FROM pedido_item JOIN pedido ON PEDIDO.id_pedido = PEDIDO_ITEM.id_pedido WHERE DATA_HORA BETWEEN :DE AND :ATE and TIPO_DOCUMENTO = 'V' and TIPO_VENDA = 'E' and PEDIDO.CANCELADO <> 'V' and PEDIDO_ITEM.CANCELADO <> 'V')

A performasse dele é essa:

[color=blue]------ Performance info ------
Prepare time = 0ms
Execute time = 1m 7s 906ms
Current memory = 17.639.756
Max memory = 18.021.016
Memory buffers = 2.048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 55.681.942[/color]

Estou usando Firebird, versão 2.5. Alguém sabe dizer por que isso está acontecendo? Esse código está com todo esse retardo executando no próprio IBExpert. A data que estou passando como parâmetro é essa:

08/05/2012 00:00:00

Alguém sabe dizer onde está o problema? Obrigado.

3 Respostas

A

Experimenta essa alteração:

select P.COD_BARRAS , P.classfiscal as NCM , P.nm_produto , P.unidade , COD_BARRAS as EAN , coalesce(P.ipi, 0) as IPI , P.ecf_aliquota , P.substtributaria FROM PRODUTOS P WHERE exists (SELECT pedido_item.CD_PRODUTO FROM pedido_item JOIN pedido ON PEDIDO.id_pedido = PEDIDO_ITEM.id_pedido WHERE DATA_HORA BETWEEN :DE AND :ATE and TIPO_DOCUMENTO = 'V' and TIPO_VENDA = 'E' and PEDIDO.CANCELADO <> 'V' and PEDIDO_ITEM.CANCELADO <> 'V' and pedito_item.cd_produto = p.cd_produto)

Mas pode ser outras coisas… tenta analisar o desempenho somente do sub-select separadamente, verifica se está usando indices… pode ter chão aí pra ver isso

Big_E

Crie índices para as tabelas, o ganho em desempenho será muito satisfatório.

Andre_Rosa

Obrigado! Fiz isso e o resultado veio em questão de segundos! :smiley:

Criado 8 de maio de 2012
Ultima resposta 8 de mai. de 2012
Respostas 3
Participantes 3