El uso de la lógica NOT en relación con los índices

12

Según el libro de Microsoft en el desarrollo de bases de datos Examen 70-433: Microsoft SQL Server 2008 de base de datos Desarrollo :

Ninguno de los caracteres comodín iniciales, NO la lógica, permite que el optimizador de consultas use índices para optimizar la búsqueda. Para un rendimiento óptimo, debe evitar usar la palabra clave NOT y los símbolos comodín iniciales.

Así que tomé eso para ser NOT IN, NOT EXISTSetc.

Ahora con respecto a esta pregunta SO , pensé que la solución elegida por @GBN violaría la declaración dada anteriormente.

Al parecer, no lo hace.

¿Mi pregunta es, porque?

Stuart Blackler
fuente

Respuestas:

21
  • NOT IN (SELECT ...)y NOT EXISTS (SELECT .. WHERE correlation..)son "Anti Semi Joins". Es decir, operaciones basadas en conjuntos reconocidos

  • WHERE NOT (MyColumn = 1) es un filtro que requiere que se miren todas las filas

Para más información, ver:

Editar: para completar

Las IZQUIERDAS a menudo funcionan peor. Ver http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

Este mismo sitio señala que en MySQL, NO EXISTE no está optimizado como otros RDBMS y LEFT JOIN es mejor

En SQL Server, sé por experiencia que LEFT JOIN no se ejecuta tan bien como NO EXISTE. También a menudo necesita DISTINCT para obtener los mismos resultados que otro paso de procesamiento.

gbn
fuente
0

Yo uso una sub-selección para esto:

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...));

Por supuesto, si su tabla es grande, querrá analizar esto para verificar el rendimiento. Si tiene cláusulas adicionales que filtran los resultados en la consulta principal, es posible que deba duplicarlas en la sub-selección. Pero independientemente, la sub-selección tiene un "IN" frente a un "NOT IN" y, por lo tanto, puede tener resultados de diferentes tamaños y, por lo general, el rendimiento de la consulta es importante, así que analice este enfoque cuando lo use con una tabla grande.

sofend
fuente