O uso da lógica NOT em relação aos índices

12

De acordo com o livro da Microsoft sobre desenvolvimento de banco de dados, Exame 70-433: Microsoft SQL Server 2008 Database Development :

Nem os caracteres curinga iniciais, nem a lógica NOT , permitem que o otimizador de consultas use índices para otimizar a pesquisa. Para um desempenho ideal, evite usar a palavra-chave NOT e os principais símbolos curinga.

Então eu achei que fosse NOT IN, NOT EXISTSetc

Agora, com relação a essa questão do SO , pensei que a solução escolhida pelo @GBN violaria a declaração acima.

Aparentemente, isso não acontece.

Então, minha pergunta é: por quê?

Stuart Blackler
fonte

Respostas:

21
  • NOT IN (SELECT ...)e NOT EXISTS (SELECT .. WHERE correlation..)são "Anti Semi Joins". Ou seja, operações baseadas em conjuntos reconhecidas

  • WHERE NOT (MyColumn = 1) é um filtro que requer que todas as linhas sejam examinadas

Para mais informações, consulte:

Editar: para completar

JUNTAS ESQUERDAS geralmente apresentam desempenho pior. Consulte http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

Este mesmo site observa que no MySQL, NOT EXISTS não é otimizado como outros RDBMS e LEFT JOIN é melhor

No SQL Server, sei por experiência que LEFT JOIN não funciona tão bem quanto NÃO EXISTE. Você também precisa do DISTINCT para obter os mesmos resultados que em outra etapa do processamento.

gbn
fonte
0

Eu uso uma sub-seleção para isso:

SELECT m* from Main AS m 
    WHERE m.id NOT IN 
        (SELECT m2.id FROM Main AS m2 
           WHERE m2.id IN (...possibly null/empty list goes here...));

Obviamente, se sua mesa for grande, convém analisar isso para verificar o desempenho. Se você tiver cláusulas adicionais filtrando os resultados na consulta principal, pode ser necessário duplicá-las na sub-seleção. Mas, independentemente disso, a sub-seleção tem um "IN" vs um "NOT IN" e, portanto, pode ter resultados de tamanho diferentes e, geralmente, o desempenho da consulta é importante; portanto, analise essa abordagem ao usar uma tabela grande.

sofend
fonte