Melhorar a performance desse Select

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Bom dia, como poderia melhorar a performance desse select?

Selecionar tudo

SELECT FIL.CODFIL LOJA,
       FIL.CIDADE,
       TO_CHAR(NRO.DATANRSORTE, 'DD/MM/YYYY') DATAVENDA,
       COUNT(NRO.NROSORTE) CARTELAS
  FROM CYBELAR_NROSORTE NRO, CAD_FILIAL FIL
 WHERE NRO.FLGUSO = 1
   AND NRO.NOMCLI IS NOT NULL
   AND NRO.LOJA = FIL.CODFIL
   AND TO_CHAR(NRO.DATANRSORTE, 'MMYYYY') = <mês_ano>
   AND NRO.LOJA = <numero da loja>
 GROUP BY FIL.CODFIL, FIL.CIDADE, TO_CHAR(NRO.DATANRSORTE, 'DD/MM/YYYY')
 ORDER BY LOJA, DATAVENDA
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

desses campos quais são indices ?

Selecionar tudo

NRO.FLGUSO
NRO.NOMCLI
NRO.LOJA 
FIL.CODFIL
NRO.DATANRSORTE
NRO.LOJA
DATAVENDA 

eu tenho comigo o mito de que o join deve ser o primeiro item do where..
mas não sei se isso realmente otimiza

Selecionar tudo

...
 WHERE NRO.LOJA = FIL.CODFIL
   AND NRO.NOMCLI IS NOT NULL
   AND NRO.FLGUSO = 1
   AND TO_CHAR(NRO.DATANRSORTE, 'MMYYYY') = <mês_ano>
   AND NRO.LOJA = <numero da loja>
 GROUP BY FIL.CODFIL, FIL.CIDADE, TO_CHAR(NRO.DATANRSORTE, 'DD/MM/YYYY')
 ORDER BY LOJA, DATAVENDA
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Poste o explain plan aí... Qual a versão do teu Oracle?
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

não se se foi isso que solicitou

Imagem
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Isso aqui está péssimo:

Selecionar tudo

 AND TO_CHAR(NRO.DATANRSORTE, 'MMYYYY') = <mês_ano>]
Poderia ser assim:

Selecionar tudo

 AND NRO.DATANRSORTE >= trunc( p_data, 'MM')
 AND NRO.DATANRSORTE <  trunc( add_months(p_data,1), 'MM')
Dessa forma não precisa usar função no campo.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

victorhugomuniz escreveu:eu tenho comigo o mito de que o join deve ser o primeiro item do where..
mas não sei se isso realmente otimiza
Isso só é valido quando o otimizador está configurado para REGRA (RBO - rule based optimizer). Mas isso "saiu de linha" depois do oracle 9i, e o Cost Based Optimizer passou a ser padrão. (CBO). Daí a única coisa que importa é que tenha estatísticas atualizadas, histogramas, etc.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

dr_gori escreveu:
victorhugomuniz escreveu:eu tenho comigo o mito de que o join deve ser o primeiro item do where..
mas não sei se isso realmente otimiza
Isso só é valido quando o otimizador está configurado para REGRA (RBO - rule based optimizer). Mas isso "saiu de linha" depois do oracle 9i, e o Cost Based Optimizer passou a ser padrão. (CBO). Daí a única coisa que importa é que tenha estatísticas atualizadas, histogramas, etc.
valeu pela explicação big boss.. :mrgreen:
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Eu alterei a linha, mas está dando um erro

Selecionar tudo

AND NRO.DATANRSORTE >= trunc('01/09/2010', 'MM')
   and NRO.DATANRSORTE < trunc(Add_months('01/09/2010', 1), 'MM')
Dá o erro ORA-00932: inconsistent datatypes: expected DATE got NUMBER no sinal >=
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

tira

Selecionar tudo

trunc('01/09/2010', 'MM')

coloca

Selecionar tudo

to_char(to_date('01/09/2010'), 'MM')
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Muito obrigado a todos

Melhorou significavelmente a performance do select alterando de

Selecionar tudo

AND TO_CHAR(NRO.DATANRSORTE, 'MMYYYY') = <mês_ano>]
para

Selecionar tudo

AND NRO.DATANRSORTE >= trunc(to_date('01/09/2010'), 'MM')
   and NRO.DATANRSORTE < trunc(Add_months('01/09/2010', 1), 'MM')
antes era executado na casa dos minutos, agora passou a ser segundos!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

SHOW!

No caso que eu postei, eu estava considerando "p_data" como um tipo DATA. Por isso que deu erro quando você substituiu pra '01/09/2010' --> que é um string!

:-o :-o :-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes