Query de forma mais performática

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
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Boa tarde galera.

Gostaria da ajuda de vocês para fazer a validação no where abaixo de forma mais performática
Hoje verifico se o parâmetro vem nulo ou se vêm preenchido com o campo da query.
Existe outra forma mais performática?

.
.
.
WHERE C.BLOQ = 0
AND (P_LOG IS NULL OR OP.LOG = P_LOG)
AND (P_ID_CLI IS NULL OR P_ID_CLI = 0 OR C.ID = P_ID_CLI)
AND (P_ID_CIDADE IS NULL OR P_ID_CIDADE = 0 OR P_ID_CIDADE = -1 OR CD.ID = P_ID_CIDADE)
AND (P_ID_REGIAO IS NULL OR P_ID_REGIAO = 0 OR P_ID_REGIAO = -1 OR RG.ID_REGIAO = P_ID_REGIAO);
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

OLá Moloukos,
geralmente o grande X da questão da performance das consultas é relacionamentos (índices).
Caso já esteja tudo ok com seus relacionamentos e o problema acontece quando você vai passar os parâmetros então deve-se focar realmente neles.

Precisa ver se realmente todos parâmetros podem ser nulos.
Não entendo porque você num mesmo parâmetro faz 4 validações: se null, se 0 , se -1, se igual ao campo. Muitos "OR" aninhados é bom indício de desempenho.
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Daniel, entendo o que você diz sobre as validações se null, se 0 , se -1, se igual ao campo...

Na verdade a validação que queria melhorar era a da linha abaixo, onde posso receber o parâmetro null ou igual ao campo da tabela.

WHERE C.BLOQ = 0
AND (P_LOG IS NULL OR OP.LOG = P_LOG)

Queria uma maneira mais performatica de fazer essa parte da query
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Cara, tenta da seguinte forma e depois diga se melhora:

Selecionar tudo

WHERE C.BLOQ = 0
AND OP.LOG = NVL(P_LOG,OP.LOG)
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Daniel, bom dia.

Dessa forma a query se torna mais lenta.

Utilizei o Explain plan do Pl/Sql Developer para os testes.
Responder
  • Informação
  • Quem está online

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