'dan önemli ölçüde daha hızlı Bir tablo var (MainTable
) biraz üzerinde 600.000 kayıt var. Bu bir üst/alt tipi ilişkide bir 2 tablosundaki (JoinTable
) üzerinden kendi üzerine katılır:SOL JOIN INNER JOIN
SELECT Child.ID, Parent.ID
FROM MainTable
AS Child
JOIN JoinTable
ON Child.ID = JoinTable.ID
JOIN MainTable
AS Parent
ON Parent.ID = JoinTable.ParentID
AND Parent.SomeOtherData = Child.SomeOtherData
Ben her çocuk rekor bir üst kaydı ve JoinTable verileri acurate olduğunu olduğunu biliyoruz.
Bu sorguyu çalıştırdığımda, tam anlamıyla çalıştırılacak dakikalar alır. Bir Sol Üyelik kullanarak ana şirkete katılmak Ancak o zaman çalıştırmak için < 1 saniye sürer:
SELECT Child.ID, Parent.ID
FROM MainTable
AS Child
JOIN JoinTable
ON Child.ID = JoinTable.ID
LEFT JOIN MainTable
AS Parent
ON Parent.ID = JoinTable.ParentID
AND Parent.SomeOtherData = Child.SomeOtherData
WHERE ...[some info to make sure we don't select parent records in the child dataset]...
Bir INNER JOIN
ve LEFT JOIN
arasındaki sonuçlarında farkı anlamak. Bu durumda, her çocuğun bir ebeveyni olduğu gibi, tam olarak aynı sonucu döndürüyor. Her iki sorgunun da çalışmasına izin veriyorum, veri kümelerini karşılaştırabilirim ve tam olarak aynıdır.
Neden LEFT JOIN
INNER JOIN
'dan çok daha hızlı çalışıyor?
GÜNCELLEME sorgu planları İşaretli ve kullanırken bir iç o Veli veri kümesi ile başlar katılmak. Bir sol birleştirmeyi yaparken, alt veri kümesi ile başlar.
Kullandığı dizinler hepsi aynı.
Her zaman çocukla başlamaya zorlayabilir miyim? Bir sol birleştirme kullanımı, sadece yanlış geliyor.
Benzer sorular daha önce burada soruldu, ancak hiçbiri soruma yanıt vermiyor gibi görünüyor.
örn. INNER JOIN vs LEFT JOIN performance in SQL Server'daki seçilen cevap, Sol Katılmaların her zaman Inner birleşimlerinden daha yavaş olduğunu belirtir. Argüman mantıklı, ama görüyorum ki değil.
Planları kontrol edin. – Blorgbeard
@Blogbeard - bkz. Güncelleme – Greg