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?

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.