Dizinlerle ilişkili DEĞİL mantığı kullanımı


12

Microsoft'un veritabanı geliştirme kitabına göre Sınav 70-433: Microsoft SQL Server 2008 Veritabanı Geliştirme :

Mantık DEĞİL olmayan önde gelen joker karakterler , sorgu optimize edicinin aramayı optimize etmek için dizinler kullanmasına izin vermez. En iyi performans için NOT anahtar sözcüğünü ve önde gelen joker karakter sembollerini kullanmaktan kaçınmalısınız .

Bu yüzden aldım NOT IN, NOT EXISTSvb.

Şimdi bu SO sorusuna gelince , @GBN tarafından seçilen çözümün yukarıda verilen ifadeyi ihlal edeceğini düşündüm.

Görünüşe göre, öyle değil.

Benim sorum şu: Neden?

Yanıtlar:


21
  • NOT IN (SELECT ...)ve NOT EXISTS (SELECT .. WHERE correlation..)"Anti Yarı Birleşimler" dir. Yani, tanınan set tabanlı işlemler

  • WHERE NOT (MyColumn = 1) tüm satırlara bakılmasını gerektiren bir filtredir

Daha fazla bilgi için, bkz.

Düzenleme: bütünlük için

SOL BAĞLANTILAR genellikle daha kötü performans gösterir. Bkz. Http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

Aynı site, MySQL'de NOT EXISTS'in diğer RDBMS gibi optimize edilmediğini ve LEFT JOIN'in daha iyi olduğunu belirtiyor

SQL Server'da, LEFT JOIN'ın VAR DEĞİL kadar iyi çalışmadığını da biliyorum. Ayrıca başka bir işleme adımı ile aynı sonuçları elde etmek için DISTINCT'e ihtiyacınız vardır.


0

Bunun için bir alt seçim kullanıyorum:

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

Tabii ki tablonuz büyükse, performansı kontrol etmek için bunu analiz etmek istersiniz. Ana sorgudaki sonuçları filtreleyen ek hükümler varsa, bunları alt seçimde çoğaltmanız gerekebilir. Ancak ne olursa olsun, alt seçimin "IN" ve "NOT IN" karşılaştırması vardır ve bu nedenle farklı boyut sonuçları olabilir ve genellikle sorgu performansı önemlidir, bu nedenle büyük bir tabloyla kullanırken bu yaklaşımı analiz edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.