L'uso della logica NOT in relazione agli indici


12

Secondo il libro di Microsoft sullo sviluppo del database Esame 70-433: Sviluppo del database Microsoft SQL Server 2008 :

Né i caratteri jolly iniziali che NON la logica consentono a Query Optimizer di utilizzare gli indici per ottimizzare la ricerca. Per prestazioni ottimali, è necessario evitare l'uso della parola chiave NOT e dei simboli jolly iniziali.

Quindi ho pensato che fosse NOT IN, NOT EXISTSecc

Ora per quanto riguarda questa domanda SO , ho pensato che la soluzione scelta da @GBN avrebbe violato la dichiarazione di cui sopra.

Apparentemente no.

Quindi la mia domanda è: perché?

Risposte:


21
  • NOT IN (SELECT ...)e NOT EXISTS (SELECT .. WHERE correlation..)sono "Anti Semi Joins". Cioè, operazioni basate sul set riconosciute

  • WHERE NOT (MyColumn = 1) è un filtro che richiede la visualizzazione di tutte le righe

Per maggiori informazioni, vedi:

Modifica: per completezza

I JOIN SINISTRI spesso hanno prestazioni peggiori. Vedi http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

Questo stesso sito rileva che in MySQL, NOT EXISTS non è ottimizzato come gli altri RDBMS e LEFT JOIN è migliore

In SQL Server, so per esperienza che LEFT JOIN non funziona così come NON ESISTE. Spesso è necessario anche DISTINCT per ottenere gli stessi risultati di un'altra fase di elaborazione.


0

Uso una sottoselezione per questo:

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

Ovviamente se il tuo tavolo è grande, ti consigliamo di analizzarlo per verificare le prestazioni. Se hai ulteriori clausole che filtrano i risultati nella query principale, potrebbe essere necessario duplicarli nella sottoselezione. Tuttavia, la sottoselezione ha un "IN" contro un "NOT IN" e quindi può avere risultati di dimensioni diverse e, di solito, le prestazioni delle query sono importanti, quindi analizza questo approccio quando lo usi con una tabella grande.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.