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
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 NULL
s NOT IN
sürüm olacak biraz daha çalışmalıyım (bile yok NULL
s * aslında mevcut verileri) ve anlambilim NOT IN
NULL
lerhediye neyse istediklerinizi olması olası değildir.
Ne Products.ProductID
[Order Details].ProductID
NULL
s 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.
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
ProductId
herhangi 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.
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.
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.
Sütun NULL
-mümkün değiştiğinde NOT IN
şimdi plan gibi görünüyor
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
ProductID
herhangi bir s içeriyor mu yoksa işlemleri gerekli arama sayısı iki katına çıkacak.
HttpUtility geçerli bağlamda mevcut de...
Vs MEVCUT DEĞİL...
Geri eğer Sözlük anahtarı mevcut değil...
Java özellikleri Java dilinde mevcut d...
GlobalConfiguration.() Web API 2 ve so...