Aumento de performance no select?
Tenho um select assim
Ao executalo tenho uma perfirmance assim
Porém preciso executar com mais de um CODIGO e coloquei um IN no lugar do = e pronto, nem vai mais
Apenas passando os parametros
codigo: 67
dataini 01/0/2008
datafin 15/07/2008
Não vai nem a pau com IN.
SELECT VIR.ID_PAGAMENTO_TITULAR, VI.NOME_TITULAR, VI.APELIDO_TITULAR, SUM(VIR.valor_rateio_titular) AS RATEIO_TITULAR FROM VENDAS_ITENS_RATEIO VIR INNER JOIN VENDAS_ITENS VI ON (VIR.CODIGO = VI.CODIGO AND VIR.CODIGO_ITEM = VI.CODIGO_ITEM ) AND VIR.ID_PAGAMENTO_TITULAR = (SELECT distinct(processamento_rateio_itens.CODIGO) FROM processamento_rateio_itens where processamento_rateio_itens.codigo = :codigoini and CAST(processamento_rateio_itens.data_processamento AS DATE) BETWEEN :inicio AND :final ) AND VIR.VALOR_RATEIO_TITULAR > 0 GROUP BY 1,2,3
Ao executalo tenho uma perfirmance assim
------ Performance info ------
Prepare time = 63ms
Execute time = 203ms
Prepare time = 63ms
Execute time = 203ms
Porém preciso executar com mais de um CODIGO e coloquei um IN no lugar do = e pronto, nem vai mais
SELECT VIR.ID_PAGAMENTO_TITULAR, VI.NOME_TITULAR, VI.APELIDO_TITULAR, SUM(VIR.valor_rateio_titular) AS RATEIO_TITULAR FROM VENDAS_ITENS_RATEIO VIR INNER JOIN VENDAS_ITENS VI ON (VIR.CODIGO = VI.CODIGO AND VIR.CODIGO_ITEM = VI.CODIGO_ITEM ) AND VIR.ID_PAGAMENTO_TITULAR IN (SELECT distinct(processamento_rateio_itens.CODIGO) FROM processamento_rateio_itens where processamento_rateio_itens.codigo = :codigoini and CAST(processamento_rateio_itens.data_processamento AS DATE) BETWEEN :inicio AND :final ) AND VIR.VALOR_RATEIO_TITULAR > 0 GROUP BY 1,2,3
Apenas passando os parametros
codigo: 67
dataini 01/0/2008
datafin 15/07/2008
Não vai nem a pau com IN.
Adriano Dolce
Curtidas 0
Respostas
Emerson Nascimento
18/07/2011
de que tipo é o seu campo processamento_rateio_itens.data_processamento? achei estranho você usar o cast() ali...
de qualquer forma, tente assim:
SELECT
VIR.ID_PAGAMENTO_TITULAR,
VI.NOME_TITULAR,
VI.APELIDO_TITULAR,
SUM(VIR.valor_rateio_titular) AS RATEIO_TITULAR
FROM
VENDAS_ITENS_RATEIO VIR
INNER JOIN
VENDAS_ITENS VI ON (VI.CODIGO = VIR.CODIGO AND VI.CODIGO_ITEM = VIR.CODIGO_ITEM)
WHERE
VIR.VALOR_RATEIO_TITULAR > 0
AND VIR.ID_PAGAMENTO_TITULAR BETWEEN :codigoini AND :codigofim
AND EXISTS(
SELECT DISTINCT(PRIT.CODIGO)
FROM processamento_rateio_itens PRIT
WHERE PRIT.codigo = VIR.ID_PAGAMENTO_TITULAR
AND CAST(PRIT.data_processamento AS DATE) BETWEEN :inicio AND :final
)
GROUP BY 1,2,3
note que para ter uma boa performance é necessários criar índices por todos os campos envolvidos em relacionamentos e, se imprescindível, por aqueles usados na condição de filtragem.
seguindo isso, podem ser criados os indices:
TABELA CAMPOS
---------------------------------------------------------------------------------
VENDAS_ITENS_RATEIO - ID_PAGAMENTO_TITULAR, VALOR_RATEIO_TITULAR
VENDAS_ITENS - CODIGO, CODIGO_ITEM
PROCESSAMENTO_RATEIO_ITENS - CODIGO, DATA_PROCESSAMENTO
de qualquer forma, tente assim:
SELECT
VIR.ID_PAGAMENTO_TITULAR,
VI.NOME_TITULAR,
VI.APELIDO_TITULAR,
SUM(VIR.valor_rateio_titular) AS RATEIO_TITULAR
FROM
VENDAS_ITENS_RATEIO VIR
INNER JOIN
VENDAS_ITENS VI ON (VI.CODIGO = VIR.CODIGO AND VI.CODIGO_ITEM = VIR.CODIGO_ITEM)
WHERE
VIR.VALOR_RATEIO_TITULAR > 0
AND VIR.ID_PAGAMENTO_TITULAR BETWEEN :codigoini AND :codigofim
AND EXISTS(
SELECT DISTINCT(PRIT.CODIGO)
FROM processamento_rateio_itens PRIT
WHERE PRIT.codigo = VIR.ID_PAGAMENTO_TITULAR
AND CAST(PRIT.data_processamento AS DATE) BETWEEN :inicio AND :final
)
GROUP BY 1,2,3
note que para ter uma boa performance é necessários criar índices por todos os campos envolvidos em relacionamentos e, se imprescindível, por aqueles usados na condição de filtragem.
seguindo isso, podem ser criados os indices:
TABELA CAMPOS
---------------------------------------------------------------------------------
VENDAS_ITENS_RATEIO - ID_PAGAMENTO_TITULAR, VALOR_RATEIO_TITULAR
VENDAS_ITENS - CODIGO, CODIGO_ITEM
PROCESSAMENTO_RATEIO_ITENS - CODIGO, DATA_PROCESSAMENTO
GOSTEI 0
Adriano Dolce
18/07/2011
Nossa, melhorou 100000%
Muito obrigado Emerson
"note que para ter uma boa performance é necessários criar índices por todos os campos envolvidos em relacionamentos e, se imprescindível, por aqueles usados na condição de filtragem."
Blz anotado aqui.
Muito obrigado Emerson
"note que para ter uma boa performance é necessários criar índices por todos os campos envolvidos em relacionamentos e, se imprescindível, por aqueles usados na condição de filtragem."
Blz anotado aqui.
GOSTEI 0