Versões comparadas

Chave

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

...

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.

Expandir
titlePrática nº4

No SELECT, trazer apenas as colunas necessárias;

Exemplo:

Vimos este estudo no segundo tópico deste documento, escolher as colunas prioritárias que estão citadas nos índices ‘não clusterizados’ para depois adotar as demais colunas que serão cobertas pelo índice ‘clusterizado’ referente a chave primária. Caso exista alguma coluna elegível a ser associada a algum índice ‘não clusterizado’, entre em contato conosco para avaliarmos a sugestão e apresentarmos ao produto tal oportunidade de melhoria.

Obs.: é muito importante não usar o “SELECT * FROM” nas suas consultas, sempre avaliar se precisa de todas colunas da tabela para sua análise. Pode ser que uma das colunas que seriam desnecessárias para sua pesquisa possua dados que ocuparam megas, gigas de seus recursos gerando lentidão em todo o banco de dados e sistema desnecessariamente.

Expandir
titlePrática nº5

Para Sub-Selects na cláusula WHERE, considere utilizar EXISTS ao invés de IN;

Exemplo:

A cláusula EXISTS trabalha como um comando de decisão, caso o valor seja encontrado segundo a consulta apontada pela EXISTS, então a consulta principal será executada. Neste exemplo só vou buscar a lista de pessoas caso exista pelo menos uma pessoa com a data de nascimento dia 24/04/69:

SELECT * FROM PPESSOA (NOLOCK) 

 WHERE EXISTS ( SELECT TOP 1 'OK' FROM PPESSOA (NOLOCK) 

WHERE DTNASCIMENTO = '1969-04-24' )

Geram o mesmo número de linhas com dois conceitos aplicados:

Image Modified

Obs. Uma sugestão para o uso da cláusula IN, por exemplo, tenho uma lista de palavras que preciso fixá-las no filtro, neste caso tente usar a seguinte semântica:

Antes:  SELECT * FROM PPESSOA WHERE APELIDO IN ('EDSON','DANIEL','ANDRE')

Depois: SELECT * FROM PPESSOA WHERE APELIDO  IN (SELECT * FROM ( VALUES ('EDSON'),('DANIEL'),('ANDRE') ) MINHALISTA(APELIDO))

Este ganho será evidente principalmente se a lista tiver muitos valores, no exemplo abaixo foi inserida uma lista de 673 valores e já podemos ver o ganho de 2%, sendo mais expressivo dependendo do conteúdo da tabela e o tipo de dados filtrados:

Image Modified

Expandir
titlePrática nº6

Between no lugar de Or/And dependendo do caso? Esta é uma dúvida que sempre aparece quando precisamos usar essa cláusula, vamos entender:

SELECT * FROM PFFINANC WHERE VALOR BETWEEN 100 AND 200

SELECT * FROM PFFINANC WHERE VALOR >= 100 AND VALOR <= 200 

O predicado para essas duas consultas é o mesmo, ou seja, internamente o sgbd* entende a instrução de cima igualmente em relação a de baixo. O uso do between seria apenas para facilitar a criação da instrução, salvo o caso em que mesmo os valores das extremidades da faixa não podem entrar para o grupo apurado, por exemplo:

SELECT VALOR FROM PFFINANC WHERE > 0 AND VALOR <= 200 → neste caso NÃO retorna linhas com valor zero

SELECT VALOR FROM PFFINANC WHERE VALOR BETWEEN  0 AND 200 → neste caso o valor zero está incluso.

Expandir
titlePrática nº7

Order by é caro no sql. 

O uso desse recurso precisa ser bem avaliado, precisa pensar se a tela a qual o conteúdo da tabela vai ser apresentada tem recursos de ordenação, caso consiga é melhor buscar toda tabela sem organizar e fazê-lo pela aplicação. O uso do ‘order by’ é bem válido quando temos uma tabela muito grande e precisamos pegar somente alguns registros ordenados, por exemplo o uso da cláusula TOP N com o complemento do ‘order by’. Em outras palavras, não vale a pena buscar milhões de registros do banco sendo que preciso buscar os 3 primeiros com valor maior ou menor:

SELECT TOP 3 VALOR, CHAPA  FROM PFFINANC ORDER BY VALOR DESC

Dicas importantes: 

    • Tente não usar função agregada no order by, por exemplo

            ORDER BY  CAST(COLUNA AS VARCHAR(10)) DESC

    • Ao fazer um insert com o resultado de um select, nunca use o order by nesse select:

INSERT INTO TABELA1    

    SELECT  COLUNA1, COLUNA2 FROM TABELA2 ORDER BY COLUNA1  DESC













  • De preferência em usar JOIN no lugar de UNION. Vamos entender as diferenças entre estas cláusulas para conseguir aplicá-las sem perder a performance e objetivo da consulta:

No caso do ‘Union’, serve principalmente para unificar linhas entre duas tabelas que possuem mesmas colunas e unificar as linhas que são idênticas entre ambas. Veja que o objectivo objetivo foi atingido listando todas as linhas das tabelas eliminando as repetições:

...