SQL Server'da INNER JOIN ve LEFT JOIN Performansı


259

9 tablolarda INNER JOIN kullanan SQL komutu oluşturdum, yine de bu komut çok uzun zaman alıyor (beş dakikadan fazla). Bu yüzden halkım INNER JOIN'i LEFT JOIN olarak değiştirmemi önerdi çünkü bildiklerime rağmen LEFT JOIN performansı daha iyi. Değiştirdikten sonra, sorgu hızı önemli ölçüde arttı.

LEFT JOIN'in neden INNER JOIN'den daha hızlı olduğunu bilmek isterim?

SQL komutum aşağıdaki gibi görünür: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN Dvb.

Güncelleme: Bu benim şemamın özeti.

FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
    INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
        ON a.CompanyCd = b.CompanyCd 
           AND a.SPRNo = b.SPRNo 
           AND a.SuffixNo = b.SuffixNo 
           AND a.dnno = b.dnno
    INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine
        ON a.CompanyCd = h.CompanyCd
           AND a.sprno = h.AcctSPRNo
    INNER JOIN exFSlipHdr c -- PK = CompanyCd, FSlipNo, FSlipSuffix
        ON c.CompanyCd = h.CompanyCd
           AND c.FSlipNo = h.FSlipNo 
           AND c.FSlipSuffix = h.FSlipSuffix 
    INNER JOIN coMappingExpParty d -- NO PK AND FK
        ON c.CompanyCd = d.CompanyCd
           AND c.CountryCd = d.CountryCd 
    INNER JOIN coProduct e -- PK = CompanyCd, ProductSalesCd
        ON b.CompanyCd = e.CompanyCd
           AND b.ProductSalesCd = e.ProductSalesCd 
    LEFT JOIN coUOM i -- PK = UOMId
        ON h.UOMId = i.UOMId 
    INNER JOIN coProductOldInformation j -- PK = CompanyCd, BFStatus, SpecCd
        ON a.CompanyCd = j.CompanyCd
            AND b.BFStatus = j.BFStatus
            AND b.ProductSalesCd = j.ProductSalesCd
    INNER JOIN coProductGroup1 g1 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup1Cd
        ON e.ProductGroup1Cd  = g1.ProductGroup1Cd
    INNER JOIN coProductGroup2 g2 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup2Cd
        ON e.ProductGroup1Cd  = g2.ProductGroup1Cd

1
Herhangi bir özelliği yansıtıyor coUOMmusunuz? Değilse, yarı birleştirme kullanabilirsiniz. Evetse, UNIONalternatif olarak kullanabilirsiniz . FROMBurada sadece maddenizi yayınlamak yetersiz bilgi.
gün15

1
Bunu çok sık merak ettim (çünkü her zaman görüyorum).
Paul Draper

1
Kısa şemanızda bir Order By'ı kaçırdınız mı? Kısa süre önce, bir INNER JOIN'ın LEFT OUTER JOIN olarak değiştirilmesinin sorguyu 3 dakikadan 10 saniyeye kadar hızlandırdığı bir sorunla karşılaştım. Sorgunuzda gerçekten Sıralama Ölçütü varsa, daha fazla yanıt olarak açıklayacağım. Bütün cevaplar karşılaştığım davayı gerçekten açıklamamış gibi görünüyordu.
Phuah Yee Keat

Yanıtlar:


403

A LEFT JOINkesinlikle bir INNER JOIN. Aslında, daha yavaş; tanım gereği, bir dış birleştirme ( LEFT JOINveya RIGHT JOIN) bir INNER JOINartı ve sonuçların boşluğunun uzatılmasının fazladan bir işini yapmak zorundadır. Ayrıca, yalnızca sonuç kümesinin büyüklüğünden dolayı toplam yürütme süresini daha da artırarak daha fazla satır döndürmesi beklenir.

(Ve bir dahi LEFT JOIN idi daha hızlı özgü nedeniyle bazı zor hayal faktörlerin birleştiği, bir işlevsel olarak eşdeğer değildir üzere durumlar INNER JOINsadece birini diğerinin tüm örneklerini yerine gidemez, böylece!)

Büyük olasılıkla performans sorunlarınız başka bir yerde, örneğin bir aday anahtarın veya yabancı anahtarın doğru bir şekilde dizine eklenmemiş olması gibi. 9 tabloları katılmak için oldukça çok yani yavaşlama neredeyse her yerde olabilir. Şemanızı gönderirseniz, daha fazla ayrıntı sağlayabiliriz.


Düzenle:

Bu konuya daha fazla değinerek, a'nın daha LEFT JOINhızlı olabileceği bir durumu düşünebilirim INNER JOINve işte o zaman:

  • Bazı tablolar çok küçüktür (örneğin 10 satırın altında);
  • Tablolarda sorguyu kapsayacak kadar yeterli dizin yoktur.

Bu örneği düşünün:

CREATE TABLE #Test1
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test1 (ID, Name) VALUES (1, 'One')
INSERT #Test1 (ID, Name) VALUES (2, 'Two')
INSERT #Test1 (ID, Name) VALUES (3, 'Three')
INSERT #Test1 (ID, Name) VALUES (4, 'Four')
INSERT #Test1 (ID, Name) VALUES (5, 'Five')

CREATE TABLE #Test2
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test2 (ID, Name) VALUES (1, 'One')
INSERT #Test2 (ID, Name) VALUES (2, 'Two')
INSERT #Test2 (ID, Name) VALUES (3, 'Three')
INSERT #Test2 (ID, Name) VALUES (4, 'Four')
INSERT #Test2 (ID, Name) VALUES (5, 'Five')

SELECT *
FROM #Test1 t1
INNER JOIN #Test2 t2
ON t2.Name = t1.Name

SELECT *
FROM #Test1 t1
LEFT JOIN #Test2 t2
ON t2.Name = t1.Name

DROP TABLE #Test1
DROP TABLE #Test2

Bunu çalıştırırsanız ve yürütme planını görüntülerseniz, yukarıdaki iki ölçütü karşıladığından, INNER JOINsorgunun gerçekten maliyetinden daha pahalı olduğunu görürsünüz LEFT JOIN. Çünkü SQL Server için bir karma eşleştirme yapmak ister INNER JOIN, ancak için iç içe döngüler yapar LEFT JOIN; birincisi normalde çok daha hızlıdır, ancak satır sayısı çok küçük olduğundan ve kullanılacak bir dizin olmadığından, karma işleminin sorgunun en pahalı kısmı olduğu ortaya çıkar.

Aynı öğeyi, 5 öğeli bir karma tabloya karşılık 5 öğeli bir listede çok sayıda arama yapmak için en sevdiğiniz programlama dilinde bir program yazarak görebilirsiniz. Boyut nedeniyle, karma tablo sürümü aslında daha yavaştır. Ancak bunu 50 öğeye veya 5000 öğeye yükseltin ve liste sürümü tarama için yavaşlar, çünkü hashtable için O (N) ve O (1).

Ancak bu sorguyu IDbunun yerine sütun üzerinde olacak şekilde değiştirin Name; çok farklı bir hikaye göreceksiniz. Bu durumda, her iki sorgu için iç içe döngüler yapar, ancak INNER JOINsürüm kümelenmiş dizin taramalarından birini bir arama ile değiştirebilir - bu, kelimenin tam anlamıyla çok sayıda satırla daha hızlı bir büyüklük sırası olacağı anlamına gelir .

Sonuç olarak, yukarıda birkaç paragraftan bahsettiğim sonuç şudur; bu neredeyse kesinlikle bir indeksleme veya indeks kapsama problemidir, muhtemelen bir veya daha fazla çok küçük tablo ile birleştirilir. Bunlar SQL Server altında sadece haller şunlardır olabilir bazen için daha kötü yürütme planını seçmek INNER JOINbir daha LEFT JOIN.


4
Bir OUTER JOIN'in bir INNER JOIN'dan daha iyi performans göstermesine neden olabilecek başka bir senaryo daha var. Cevabımı aşağıda görebilirsiniz.
dbenham

12
İç bağlantıların ve dış bağlantıların performansının farklı olduğu fikrini destekleyen hiçbir veritabanı belgesi olmadığını belirtmek istiyorum. Dış birleşimler, verilerin hacmi ve sonuç kümesinin boyutu nedeniyle iç birleşmelerden biraz daha pahalıdır. Ancak, temel algoritmalar ( msdn.microsoft.com/en-us/library/ms191426(v=sql.105).aspx ) her iki birleştirme türü için aynıdır. Performans, benzer miktarda veri döndürdüklerinde benzer olmalıdır.
Gordon Linoff

3
@Aaronaught. . . Bu cevaba "dış birleşimlerin iç birleşmelerden çok daha kötü performans gösterdiği" etkisine bir şey söyleyen bir yorumda atıfta bulunulmuştur. Sadece bu yanlış yorumun yayılmadığından emin olmak için yorum yaptım.
Gordon Linoff

16
Bu cevabın önemli bir açıdan yanıltıcı olduğunu düşünüyorum: Çünkü “SOL BİR BİRLEŞTİRME kesinlikle bir İÇ ORTAK BİRLEŞTİRMEDEN daha hızlı değildir” diyor. Bu satır doğru değil. Öyle teorik bir INNER JOIN daha hızlı değil. Öyle DEĞİL "kesinlikle değil hızlı." Soru özellikle bir performans sorusudur. Uygulamada, INNER JOIN'in OUTER JOIN'e kıyasla gülünç derecede yavaş olduğu birkaç sistem gördüm (çok büyük şirketler tarafından!). Teori ve pratik çok farklı şeylerdir.
David Frenkel

5
@DavidFrenkel: Bu pek olası değil. Böyle bir tutarsızlığın mümkün olduğuna inanıyorsanız, yürütme planlarıyla bir A / B karşılaştırması görmek isterim. Muhtemelen önbelleğe alınmış sorgu / yürütme planları veya kötü istatistiklerle ilgilidir.
Aaronaught

127

Bir dış birleşmenin henüz tartışılmayan bir iç birleşmeden daha hızlı olmasına yol açabilecek önemli bir senaryo vardır.

Bir dış birleştirmeyi kullanırken, birleştirme sütunları dış tablonun PK'sıysa ve dış tablo sütunlarının hiçbirine dış birleştirmenin kendisinin dışından başvurulmuyorsa, en iyi duruma getirici dış birleştirilmiş tabloyu yürütme planından çıkarmak için her zaman serbesttir. Örneğin SELECT A.* FROM A LEFT OUTER JOIN B ON A.KEY=B.KEYve B.KEY, B'nin PK'sidir. Hem Oracle (sürüm 10'u kullandığımı düşünüyorum) hem de Sql Server (2008 R2 kullandım) budama tablo B tablo ayarını.

Aynı şey bir iç birleşim için geçerli değildir: SELECT A.* FROM A INNER JOIN B ON A.KEY=B.KEYhangi kısıtlamalara bağlı olarak yürütme planında B gerektirebilir veya gerektirmeyebilir.

A.KEY, B.KEY'e başvuran null olabilecek bir yabancı anahtarsa, her A satırı için bir B satırının bulunduğunu onaylaması gerektiğinden, optimize edici B'yi plandan çıkaramaz.

A.KEY, B.KEY'i referans alan zorunlu bir yabancı anahtarsa, optimizatör B'yi plandan çıkarmakta serbesttir, çünkü kısıtlamalar satırın varlığını garanti eder. Ancak, optimize edicinin tabloyu plandan düşürebilmesi anlamına gelmez. SQL Server 2008 R2 B planından BÜYÜMEZ. Oracle 10 B planından düşer. Bu durumda dış birleştirmenin SQL Server'daki iç birleştirmeyi nasıl gerçekleştireceğini görmek kolaydır.

Bu önemsiz bir örnektir ve tek başına bir sorgu için pratik değildir. İhtiyacınız yoksa neden bir masaya katılmalı?

Ancak bu, görünüm tasarlarken çok önemli bir tasarım değerlendirmesi olabilir. Genellikle kullanıcının merkezi bir tabloyla ilgili ihtiyaç duyabileceği her şeyi birleştiren bir "her şeyi yap" görünümü oluşturulur. (Özellikle ilişkisel modeli anlamayan geçici sorgular yapan saf kullanıcılar varsa) Görünüm, birçok tablodaki tüm ilgili sütunları içerebilir. Ancak son kullanıcılar yalnızca görünümdeki tabloların bir alt kümesinden sütunlara erişebilir. Tablolar dış birleşimlerle birleştirilirse, iyileştirici ihtiyaç duyulmayan tabloları plandan düşürebilir (ve bırakabilir).

Dış birleşimleri kullanan görünümün doğru sonuçları verdiğinden emin olmak önemlidir. Aaronaught'ın söylediği gibi - INNER JOIN yerine OUTER JOIN'i körü körüne koyamaz ve aynı sonuçları bekleyemezsiniz. Ancak, görünümleri kullanırken performans açısından yararlı olabileceği zamanlar vardır.

Son bir not - Yukarıdakilerin ışığı altında performans üzerindeki etkisini test etmedim, ancak teoride, <FOREIGN_KEY> koşulunu da eklerseniz, bir INNER JOIN'ı bir OUTER JOIN ile güvenli bir şekilde değiştirebilmeniz gerekir. nerede cümlesine.


5
Aslında son derece dinamik sorgular oluştururken bu sorunla karşılaştım. Ben kullanmak ve veri çekmiyorum bir INNER JOIN bırakmıştı ve bir LEFT JOIN (kesme meraktan dışarı) açıldığında sorgu aslında daha hızlı koştu.
Erik Philips

1
DÜZENLE - Optimize edicinin dış birleştirilmiş tabloyu yürütme planından bırakması için bulunması gereken koşullar açıklığa kavuşturuldu.
dbenham

2
Cevabınız için küçük bir açıklama: Yabancı anahtar sütunu geçersiz kılındığında, INNER JOIN ve LEFT JOIN anlamsal olarak eşdeğer hale gelir (yani önerilen WHERE yan tümcesi gereksizdir); tek fark uygulama planı olacaktır.
Douglas

2
Her ne kadar bu görünüşte önemsiz bir örnek gösterse de, bu son derece anlayışlı bir cevap!
pbalaga

6
+1: Bazı çok büyük tablolarla iç birleşimleri kullandığım birkaç sorguda bununla karşılaştım. İç birleşim, sorgu planında tempdb içine bir dökülmeye neden oldu (yukarıda belirtilen nedenden dolayı varsayıyorum - ve sunucum bellekte her şeyi tutmak için RAM eksik). Sol birleşimlere geçmek, döküntüyü tempdb'ye attı, sonuçta 20-30 saniyelik sorgularımın bir kısmı artık bir saniyenin kesirleri halinde çalışıyor. Çoğu insan, iç birleşimlerin daha hızlı olduğu battaniyesini varsayıyor gibi görmesi çok önemli bir şey.
foslait

23

Her şey olması gerektiği gibi çalışırsa, ancak hepimiz biliyoruz ki her şey özellikle sorgu optimize edici, sorgu planı önbelleğe alma ve istatistik söz konusu olduğunda olması gerektiği gibi çalışmaz.

Öncelikle dizin ve istatistiklerin yeniden oluşturulmasını, daha sonra sorgu plan önbelleğini temizlemenin, şeyleri berbat etmediğinden emin olmak için öneririm. Ancak bu işlem yapıldığında bile sorunlar yaşadım.

Sol birleşimin iç birleşmeden daha hızlı olduğu bazı durumlar yaşadım.

Bunun temel nedeni şudur: İki tablonuz varsa ve dizine sahip bir sütuna katılırsanız (her iki tabloda da). Tablo 1'deki dizindeki girdilerin üzerine döngü yaparsanız ve tersi yaparsınız gibi ikinci tabloda dizinle eşleşirseniz, içteki birleşim aynı sonucu verir: İkinci tabloda dizindeki girişlerin üzerine döngü yapın ve dizinle eşleşin Tablo 1'de. Sorun yanıltıcı istatistikleriniz olduğunda, sorgu optimize edici en az eşleşen girişleri (diğer ölçütlerinize göre) içeren tabloyu bulmak için dizinin istatistiklerini kullanacaktır. Her birinde 1 milyon olan iki tablonuz varsa, birinci tabloda 10 sıra eşleşmeniz ve ikinci tabloda 100000 satır eşleşmeniz olur. En iyi yol, birinci tabloda bir dizin taraması yapmak ve ikinci tabloda 10 kez eşleştirmek olacaktır. Bunun tersi, 100000 satırı aşan ve 100000 kez eşleştirmeye çalışan ve yalnızca 10 başarılı olan bir dizin taramasıdır. İstatistikler doğru değilse, optimize edici yanlış tablo ve dizin üzerinde döngü seçebilir.

Optimize edici sol birleştirmeyi yazıldığı sıraya göre optimize etmeyi seçerse, iç birleşimden daha iyi performans gösterir.

ANCAK, optimize edici ayrıca bir sol birleştirme bir alt yarı birleştirme olarak en uygun şekilde optimize edebilir. İstediğiniz birini seçmesini sağlamak için zorla ipucunu kullanabilirsiniz.


18

OPTION (FORCE ORDER)Sonunda her iki sorguyu da (iç ve sol birleşim olan) deneyin ve sonuçları gönderin. OPTION (FORCE ORDER)optimize ediciyi, sorguda sağladığınız birleştirme siparişiyle yürütme planını oluşturmaya zorlayan bir sorgu ipucudur.

En INNER JOINkısa sürede performans göstermeye başlarsa LEFT JOINbunun nedeni:

  • Tamamen INNER JOINs tarafından oluşturulan bir sorguda , birleştirme sırası önemli değildir. Bu, sorgu optimize ediciye birleşimleri uygun gördüğü gibi sipariş etme özgürlüğü verir, böylece sorun optimize ediciye bağlı olabilir.
  • İle LEFT JOINdurum böyle değildir çünkü birleştirme sırasını değiştirmek sorgunun sonuçlarını değiştirecektir. Bu, motorun, sorgu üzerinde sağladığınız birleştirme sırasını izlemesi gerektiği anlamına gelir; bu da optimize edilmiş olandan daha iyi olabilir.

Bu sorunuzu cevaplıyorsa bilmiyorum ama ben bir kez tamamen optimizer berbat hesaplamalar yapma son derece karmaşık sorgular içeren bir projedeydim. FORCE ORDERBir sorgunun yürütme süresini 5 dakikadan 10 saniyeye düşürecek vakalarımız vardı .


9

Sol dış ve iç birleşimler arasında bir dizi karşılaştırma yapmış ve tutarlı bir fark bulamamışlardır. Birçok değişken var. Çok sayıda alan, zaman içinde birçok değişiklik (satıcı sürümleri ve yerel iş akışı) ile binlerce tablo ile bir raporlama veritabanı üzerinde çalışıyorum. Çok çeşitli sorguların ihtiyaçlarını karşılamak ve geçmiş verileri ele almak için tüm kaplama endekslerinin kombinasyonlarını oluşturmak mümkün değildir. İç sorguların sunucu performansını öldürdüğünü gördük, çünkü iki büyük (milyondan on milyonlarca satıra) tablo, hem çok sayıda alanı çekerek hem de kaplama dizini bulunmayan dahili olarak birleştirildi.

Yine de en büyük sorun, yukarıdaki tartışmalarda ortaya çıkmış gibi görünmüyor. Belki de veritabanınız iyi veriler sağlamak için tetikleyiciler ve iyi tasarlanmış işlem işleme ile iyi tasarlanmıştır. Benimki beklenmedik yerlerde sık sık NULL değerleri var. Evet, tablo tanımları boş değerli olmayanları zorlayabilir, ancak bu benim ortamımda bir seçenek değil.

Yani soru şu ki, sorgunuzu sadece hız için mi tasarlıyorsunuz, aynı kodu dakikada binlerce kez çalıştıran işlem işleme için daha yüksek bir öncelik. Yoksa sol dış birleşimin sağlayacağı doğruluk için mi gidiyorsunuz? İç birleşimlerin her iki tarafta eşleşme bulması gerektiğini unutmayın, bu nedenle beklenmedik bir NULL yalnızca iki tablodaki verileri değil, aynı zamanda tüm bilgi satırlarını da kaldıracaktır. Ve çok güzel oluyor, hata mesajı yok.

İhtiyacınız olan verilerin% 90'ını almak ve iç birleşimlerin sessizce kaldırılmış bilgilere sahip olmadığını keşfetmekten çok hızlı olabilirsiniz. Bazen iç birleşimler daha hızlı olabilir, ancak yürütme planını gözden geçirmedikçe kimsenin bu varsayımı yapanlara inanmıyorum. Hız önemlidir, ancak doğruluk daha önemlidir.


8

Performans sorunlarınızın, yaptığınız birleştirme sayısı ve katıldığınız sütunların dizinleri olup olmadığı nedeniyle ortaya çıkma olasılığı daha yüksektir.

En kötü durum, her bir birleştirme için kolayca 9 tam tablo taraması yapıyor olabilirsiniz.


7

Dış birleşimler görünümlerde kullanıldığında üstün performans sunabilir.

Bir görünüm içeren bir sorgunuz olduğunu ve bu görünümün birleştirilen 10 tablodan oluştuğunu varsayalım. Sorgunuzun yalnızca bu 10 tablodan 3'ünün sütunlarını kullandığını varsayalım.

Bu 10 tabloları olsaydı iç katıldı birlikte, daha sonra sorgu iyileştirici sorgu kendisi 7 tabloları 10 üzerinden gerekmez halde bütün onlara katılmak zorunda kalacaktı. Çünkü iç birleşimler kendileri verileri filtreleyerek hesaplama için gerekli olabilir.

Bu 10 tabloları olsaydı dış katıldı sonra sorgu iyileştirici yalnızca gerçekten gerekli olduğunu olanları katılacağı birlikte yerine: 3 bu durumda 10 tanesi dışında. Bunun nedeni, birleşmelerin kendilerinin artık verileri filtrelememesi ve böylece kullanılmayan birleşmelerin atlanabilmesidir.

Kaynak: http://www.sqlservercentral.com/blogs/sql_coach/2010/07/29/poor-little-misunderstood-views/


1
"Dış birleşimli" ifadeniz yanıltıcıdır ve muhtemelen yanlıştır. Dış, diğer taraftaki verilerin mevcut olması gerekmediği ve NULL yerine geçmediği anlamına gelir. Belirli koşullar altında RDBMS bunları "atlayabilir" (yukarıdaki dbenham'ın cevabına bakınız). ANCAK - dış ve iç sorgunuzun kökten farklı sonuçlar döndürmesine neden olabilir. INNER, - bir öğenin İKİ VE B'de olduğu sonuçları verir. SOL DIŞ, A'nın tamamı ve varsa isteğe bağlı olarak B anlamına gelir. İlk durum - bazı satırlar, ikinci olarak TÜM satırlar alırsınız.
ripvlan

1
@ripvlan Tabii ki, iç ve dış birleşimler her zaman birbirinin yerine kullanılamaz. Orijinal soru performansla ilgiliydi, bu da her iki birleşmenin de aynı sonuç kümesini döndüreceği durumlar hakkında konuştuğumuzu ima ediyor.
MarredCheese

1
Evet ve - OUTER, tüm satırların (daha fazla veri) döndürülmesine neden olacağı için bir performans sorununa neden olabilir. Sorguların aynı çıktıyla sonuçlandığı varsayımınız adil bir çıktıdır - ancak genel durumda doğru değildir ve her db tasarımına özgü değildir. Ve ilişkisel cebire% 100 aşina olmayanlar için üzüntüye neden olabilirler. Demek istediğim sadece tavsiye arayan ve bunu bir SOL / SAĞ sihirli bir sorunu çözmek olmaz ve daha fazla sorun neden olabilir daha fazla bilgi sunmaktır. Seviye 300 için bir güç kaldı :-)
ripvlan

2

İç birleşimlerin sol birleşmelerden daha hızlı olup olmadığını kontrol ederken SQL sunucusunda ilginç bir şey buldum.

Sol birleştirilmiş tablonun öğelerini eklemezseniz, select deyiminde, sol birleştirme iç birleşmeyle aynı sorgudan daha hızlı olacaktır.

Select deyimine sol birleştirilmiş tabloyu eklerseniz, aynı sorguya sahip iç birleşim sol birleşime eşit veya daha hızlıydı.


0

Karşılaştırmalarımdan, tam olarak aynı yürütme planına sahip olduklarını görüyorum. Üç senaryo vardır:

  1. Aynı sonuçları döndürürlerse ve aynı hızda olurlarsa, aynı hıza sahiptirler. Bununla birlikte, aynı sorgular olmadığını ve SOL BİRLEŞTİRMEN'in muhtemelen daha fazla sonuç döndüreceğini (bazı ON koşulları karşılanmadığında) aklımızda tutmalıyız - bu yüzden genellikle daha yavaştır.

  2. Ana tablo (yürütme planındaki ilk sabit olmayan bir tane) kısıtlayıcı bir koşula (WHERE id =?) Sahip olduğunda ve karşılık gelen ON koşulu NULL değerinde olduğunda, "sağ" tablo birleştirilmez --- bu LEFT JOIN daha hızlı.

  3. Nokta 1'de tartışıldığı gibi, genellikle INNER JOIN daha kısıtlayıcıdır ve daha az sonuç verir ve bu nedenle daha hızlıdır.

Her ikisi de (aynı) endeksleri kullanır.

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.