Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Boas práticas e dicas para construção de uma consulta sql:


Expandir
titleDica 1Prática nº1

Ao escrever uma cláusula WHERE, sempre colocar a cláusula mais restritiva antes. Qual é a condição mais restritiva? A condição na cláusula WHERE de uma instrução que retorna o menor número de linhas de dados.

Exemplo:

SELECT COUNT(1) from ppessoa where (sexo = 'M')  -- 348260 linhas

 SELECT COUNT(1) from ppessoa WHERE (GRAUINSTRUCAO = '5') -- 966 linhas

Sendo assim:

select * from ppessoa where (GRAUINSTRUCAO = '5') AND (sexo = 'M') --certo

select * from ppessoa where (sexo = 'M') and (GRAUINSTRUCAO = '5')  --errado

Obs.: Na maioria das vezes durante a análise do plano de execução o próprio sgbd* faz essa troca internamente para aprimorar sua própria busca, contudo essa ação gera custos para ele o ideal é não deixar essa tarefa para ele e garantir o melhor resultado de sua consulta.

Expandir
titlePrática nº2

Evitar cláusulas WHERE que utilizam colunas não indexadas ou solicitar a criação do índice para a equipe de banco de dados. É muito importante avaliar quais colunas da tabela serão apresentadas no resultado bem como quais colunas participam da cláusula WHERE, caso tais colunas estejam dentro de um índice ‘não clusterizado’, será o caminho mais performático para sua consulta.

Exemplo: 

Na tabela em questão temos um índice ‘nonclustered’ com as colunas chapa, anocomp, mescomp, nroperiodo e codevento. Ao montar a consulta podemos ver que imediatamente o banco de dados decidiu usá-lo para determinar a execução da consulta:

select CHAPA, ANOCOMP, MESCOMP, NROPERIODO, CODEVENTO 

FROM PFFINANC 

WHERE CHAPA='012000069' 

AND ANOCOMP = 2022 

AND MESCOMP = 1 

AND NROPERIODO = 1 

AND CODEVENTO = '0004'

Image Modified

Image Modified



Veja o plano de execução estimado entre as duas consultas, a diferença entre a estimativa simplesmente por ter modificado as colunas a serem retornadas:

Image Modified

Obs.: Caso exista colunas na cláusula select ou na where que não estejam neste índice, será necessário usar o índice da chave primária, não sendo tão performático. Ou seja, sempre dê preferência para colunas associadas aos índices ‘não clusterizados’.

Expandir
titlePrática nº3

Não esquecer de colocar (NOLOCK) nas sentenças (exceto quando se aplica exceção)

Exemplo: 

SELECT CHAPA, ANOCOMP, MESCOMP, NROPERIODO, CODEVENTO 

FROMPFFINANC (NOLOCK)  WHERE CODEVENTO = ‘abcd’

Obs.: Caso exista alguma atualização sendo executada para o  CODEVENTO = ‘abcd’ em outra tela’, sua consulta não precisa aguardar a conclusão dessa atualização para que assim apresente os valores pedidos. O uso desse recurso só não poderá ser útil se para a sua consulta, seja expressamente necessário ter o valor mais atualizado da tabela, neste caso terá que aguardar a atualização ser concluída para depois receber tais informações. Esta abordagem não se aplica em Oracle, pois ele não permite “leitura suja”, ele possui outra abordagem para nível de isolamento.








  • No SELECT, trazer apenas as colunas necessárias;

...