SORU
6 EKİM 2008, PAZARTESİ


Vs MEVCUT DEĞİL

Bu sorguları daha hızlı?

YOK VAR:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Northwind..[Order Details] od 
    WHERE p.ProductId = od.ProductId)

Ya da DEĞİL:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
    SELECT ProductID 
    FROM Northwind..[Order Details])

Sorgu yürütme planı ikisi de aynı şeyi söylüyor. Eğer durum buysa, tavsiye edilen şeklidir?

Bu yakalayabilirsiniz veritabanı dayanmaktadır.

[Düzenle]

Yeni bulduğum bu yararlı makale: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

DEĞİL VAR daha kalacağım.

CEVAP
17 HAZİRAN 2012, Pazar


Ben her zaman NOT EXISTS varsayılan.

Yürütme planları olabilir aynı anda ama eğer iki sütun değişmiş geleceği için izin NULLs NOT IN sürüm olacak biraz daha çalışmalıyım (bile yok NULLs * aslında mevcut verileri) ve anlambilim NOT IN NULLlerhediye neyse istediklerinizi olması olası değildir.

Ne Products.ProductID [Order Details].ProductID NULLs izin NOT IN aşağıdaki sorgu aynı şekilde muamele edilecektir.

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId) 

Kesin plan değişebilir ama benim örnek veri için aşağıdaki anlıyorum.

Neither NULL

Oldukça yaygın bir yanlış kanı ilişkili alt sorgu her zaman "" birleşimler göre. kötü görünüyor Kesinlikle bir iç içe döngüler planı (satır tarafından değerlendirilmesi satır alt sorgu) zorlamak olabilir ama bu planın anti semi join bir mantıksal işleç içerir. Anti yarı iç içe döngü ile sınırlı değildir ama karma kullanım veya (bu örnekte olduğu gibi) de katıldı birleştirebilirsiniz katıldı.

/*Not valid syntax but better reflects the plan*/ 
SELECT p.ProductID,
       p.ProductName
FROM   Products p
       LEFT ANTI SEMI JOIN [Order Details] od
         ON p.ProductId = od.ProductId 

[Order Details].ProductID NULL-mümkün ise sorgu o zaman olur

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId)
       AND NOT EXISTS (SELECT *
                       FROM   [Order Details]
                       WHERE  ProductId IS NULL) 

Bunun nedeni ise [Order Details] NULL ProductIdherhangi bir s varsa doğru semantiği hiçbir sonuç geri dönmek için. Ekstra anti yarı ve plan eklenir bunu doğrulamak için satır sayısı biriktirme katılmak bakın.

One NULL

Products.ProductID NULL-mümkün olmak değiştirilirse sorgu sonra olur

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId)
       AND NOT EXISTS (SELECT *
                       FROM   [Order Details]
                       WHERE  ProductId IS NULL)
       AND NOT EXISTS (SELECT *
                       FROM   (SELECT TOP 1 *
                               FROM   [Order Details]) S
                       WHERE  p.ProductID IS NULL) 

Bunun bir nedeniNULL Products.ProductId bir sonuç olarak iade edilmelidirhariçNOT IN alt sorgu ise yaramadigini sonuçları (boş [Order Details] tablo yani) geri dönmek için. Hangi durumda gerekir. Örnek benim veri planı bu birleşim olarak aşağıda başka bir anti yarı ekleyerek uygulanır.

Both NULL

Bunun etkisi the blog post already linked by Buckley gösterilir. Örnek var mantıksal sayısının 500.000 civarında 400 artış okur.

Bu NULL-mümkün bir sütun ancak NOT IN bir tek Olası yürütme planı değildir. AdventureWorks2008 veritabanında bir sorgu için This article shows another one.

NOT NULL bir sütun ya da bir null olmayan bir sütun null karşı NOT EXISTS NOT IN için aşağıdaki planı veriyor.

Not EXists

Sütun NULL-mümkün değiştiğinde NOT IN şimdi plan gibi görünüyor

Not In - Null

Fazladan bir iç plana operatör katılın ekler. Bu aparatı explained here. Orada tekli korelasyon Endeksi iki Sales.SalesOrderDetail.ProductID = <correlated_product_id> isteyin dış satır başına dönüştürmek istiyor. Ek bir WHERE Sales.SalesOrderDetail.ProductID IS NULL.

Bu eğer o dönerse katılın yarı bir anti altında olduğu için ikinci arama herhangi bir satır ortaya çıkar. Ancak eğer Sales.SalesOrderDetail NULL ProductIDherhangi bir s içeriyor mu yoksa işlemleri gerekli arama sayısı iki katına çıkacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ehowhome

    ehowhome

    22 NİSAN 2009
  • Hollyscoop

    Hollyscoop

    30 Ocak 2007
  • Maschine Tutorials

    Maschine Tut

    15 ŞUBAT 2011