Penggunaan logika TIDAK dalam kaitannya dengan indeks

12

Menurut buku Microsoft tentang pengembangan database Ujian 70-433: Pengembangan Database Microsoft SQL Server 2008 :

Baik karakter wildcard terkemuka, BUKAN logika memungkinkan pengoptimal kueri untuk menggunakan indeks untuk mengoptimalkan pencarian. Untuk kinerja yang optimal, Anda harus menghindari penggunaan kata kunci TIDAK dan simbol wildcard terkemuka.

Jadi saya menganggapnya demikian NOT IN, NOT EXISTSdll

Sekarang sehubungan dengan pertanyaan SO ini , saya berpikir bahwa solusi yang dipilih oleh @GBN akan melanggar pernyataan yang diberikan di atas.

Ternyata tidak.

Jadi pertanyaan saya adalah: Mengapa?

Stuart Blackler
sumber

Jawaban:

21
  • NOT IN (SELECT ...)dan NOT EXISTS (SELECT .. WHERE correlation..)"Anti Semi Bergabung". Yaitu, operasi berbasis set yang dikenal

  • WHERE NOT (MyColumn = 1) adalah filter yang mengharuskan semua baris untuk dilihat

Untuk info lebih lanjut, lihat:

Edit: untuk kelengkapan

LEFT JOINs sering berkinerja lebih buruk Lihat http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

Situs yang sama ini mencatat bahwa di MySQL, BUKAN ADA tidak dioptimalkan seperti RDBMS dan LEFT JOIN lainnya lebih baik

Dalam SQL Server, saya tahu dari pengalaman bahwa KIRI BERGABUNG tidak berjalan dan TIDAK ADA. Anda juga sering perlu PERBEDAAN untuk mendapatkan hasil yang sama dengan langkah pemrosesan lainnya.

gbn
sumber
0

Saya menggunakan sub-pilih untuk ini:

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

Tentu saja jika meja Anda besar, Anda harus menganalisis ini untuk memeriksa kinerjanya. Jika Anda punya klausa tambahan yang memfilter hasil dalam permintaan utama, Anda mungkin perlu menduplikatnya di sub-pilih. Tapi bagaimanapun, sub-pilih memiliki "IN" vs "NOT IN" dan karenanya dapat memiliki hasil ukuran yang berbeda dan, biasanya, permintaan kinerja yang penting, jadi analisis pendekatan ini saat digunakan dengan tabel besar.

Sofend
sumber