Fórum Aumento de performance no select? #405199

18/07/2011

0

Tenho um select 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 (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


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

Adriano Dolce

Responder

Posts

19/07/2011

Emerson Nascimento

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



Responder

Gostei + 0

19/07/2011

Adriano Dolce

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar