Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitik Platform Sistemi (PDW)
Microsoft Fabric'te SQL veritabanı
SQL Server, aralarındaki mantıksal ilişkilere dayalı olarak birden çok tablodan veri almak için birleştirmeleri kullanır. Birleşimler ilişkisel veritabanı işlemleri için temeldir ve iki veya daha fazla tabloya ait verileri tek bir sonuç kümesinde birleştirmenizi sağlar.
SQL Server hem mantıksal birleştirme işlemlerini (Transact-SQL söz dizimi ile tanımlanır) hem de fiziksel birleştirme işlemlerini (birleştirmeleri yürütmek için kullanılan gerçek algoritmalar) uygular. Her iki yönü de anlamak verimli sorgular yazmanıza ve veritabanı performansını iyileştirmenize yardımcı olur.
Mantıksal birleştirme işlemleri şunlardır:
- İç birleşimler
- Sol, sağ ve tam dış birleşimler
- Çapraz birleşimler
Fiziksel birleştirme işlemleri şunlardır:
- İç İçe Döngü Bağlantıları
- Birleştirme birleştirmeleri
- Karma birleştirmeler
- Uyarlamalı birleşimler (Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler)
Bu makalede birleştirmelerin nasıl çalıştığı, farklı birleştirme türlerinin ne zaman kullanılacağı ve Sorgu İyileştiricisi'nin tablo boyutu, kullanılabilir dizinler ve veri dağıtımı gibi faktörlere göre en verimli birleştirme algoritmasını nasıl seçtiği açıklanmaktadır.
Note
Birleştirme söz dizimi hakkında daha fazla bilgi için bkz . FROM yan tümcesi artı JOIN, APPLY, PIVOT.
Temelleri birleştirme
Birleştirmeleri kullanarak, tablolar arasındaki mantıksal ilişkileri temel alan iki veya daha fazla tablodan veri alabilirsiniz. Birleştirmeler, SQL Server'ın başka bir tablodaki satırları seçmek için bir tablodaki verileri nasıl kullanması gerektiğini gösterir.
Birleştirme koşulu, sorguda iki tablonun nasıl ilişkili olduğunu şu şekilde tanımlar:
- Birleştirme için kullanılacak her tablodan sütunu belirtme. Tipik bir birleştirme koşulu, bir tablodaki yabancı anahtarı ve diğer tablodaki ilişkili olan anahtarı belirtir.
- Sütunlardaki değerleri karşılaştırmak için kullanılacak bir mantıksal işleç (örneğin, = veya <>,) belirtme.
Birleştirmeler aşağıdaki Transact-SQL söz dizimi kullanılarak mantıksal olarak ifade edilir:
[ INNER ] JOINLEFT [ OUTER ] JOINRIGHT [ OUTER ] JOINFULL [ OUTER ] JOINCROSS JOIN
İç birleşimler, ya FROM ya da WHERE yan tümcelerinde belirtilebilir.
Dış birleşimler ve çapraz birleşimler yalnızca yan tümcesinde FROM belirtilebilir. Birleştirme koşulları, WHERE ve HAVING arama koşulları ile birleştirilerek, FROM yan tümcesinde belirtilen temel tablolardan seçilen satırları denetler.
Yan tümcesinde birleştirme koşullarının FROM belirtilmesi, bunların yan WHERE tümcede belirtilebilen diğer arama koşullarından ayrılmasına yardımcı olur ve birleşimleri belirtmek için önerilen yöntemdir. Basitleştirilmiş bir ISO FROM yan tümcesi birleştirme söz dizimi şöyledir:
FROM first_table < join_type > second_table [ ON ( join_condition ) ]
- join_type ne tür birleştirme gerçekleştirildiğini belirtir: iç, dış veya çapraz birleşim. Farklı birleştirme türlerinin açıklamaları için bkz. FROM yan tümcesi.
- join_condition, birleştirilen her satır çifti için değerlendirilecek koşulu tanımlar.
Aşağıdaki kod, bir FROM koşul birleştirme belirtimi örneğidir.
FROM Purchasing.ProductVendor INNER JOIN Purchasing.Vendor
ON ( ProductVendor.BusinessEntityID = Vendor.BusinessEntityID )
Aşağıdaki kod, bu birleştirmeyi kullanan basit SELECT bir deyimdir:
SELECT ProductID, Purchasing.Vendor.BusinessEntityID, Name
FROM Purchasing.ProductVendor INNER JOIN Purchasing.Vendor
ON (Purchasing.ProductVendor.BusinessEntityID = Purchasing.Vendor.BusinessEntityID)
WHERE StandardPrice > $10
AND Name LIKE N'F%';
GO
Açıklama, şirket adının F harfiyle başladığı ve ürün fiyatının 10 ABD dolarının üzerinde olduğu bir şirket tarafından sağlanan parçaların herhangi bir birleşimi için ürün ve tedarikçi bilgilerini döndürür.
Tek bir sorguda birden çok tabloya başvurulduğunda, tüm sütun başvuruları belirsiz olmalıdır. Önceki örnekte hem ProductVendor hem de Vendor tablosunda bir BusinessEntityID adlı sütun vardır. Sorguda referans verilen iki veya daha fazla tablo arasında tekrarlanan tüm sütun adları tablo adıyla belirtilmelidir. Örnekteki Vendor sütunlara yapılan tüm referanslar tanımlanmıştır.
Sorguda kullanılan iki veya daha fazla tabloda sütun adı çoğaltılmadığında, buna yapılan başvuruların tablo adıyla nitelenmiş olması gerekmez. Bu, önceki örnekte gösterilmiştir. Bu tür bir SELECT yan tümceyi anlamak bazen zordur çünkü her sütunu sağlayan tabloyu gösteren hiçbir şey yoktur. Tüm sütunlar tablo adlarıyla nitelenmişse sorgunun okunabilirliği iyileştirilir. Tablo diğer adları kullanıldığında, özellikle de tablo adlarının veritabanı ve sahibi adlarıyla nitelenmesi gerektiğinde okunabilirlik daha da iyileştirilir. Aşağıdaki kod, tablo diğer adlarının atanmış olması ve okunabilirliği artırmak için tablo diğer adlarıyla nitelenmiş sütunlar dışında aynı örnektir:
SELECT pv.ProductID, v.BusinessEntityID, v.Name
FROM Purchasing.ProductVendor AS pv
INNER JOIN Purchasing.Vendor AS v
ON (pv.BusinessEntityID = v.BusinessEntityID)
WHERE StandardPrice > $10
AND Name LIKE N'F%';
Önceki örneklerde FROM yan tümcesinde birleştirme koşulları belirtildi ve bu tercih edilen yöntemdir. Aşağıdaki sorgu, WHERE ifadesinde tanımlanan birleştirme koşulunun aynısını içerir.
SELECT pv.ProductID, v.BusinessEntityID, v.Name
FROM Purchasing.ProductVendor AS pv, Purchasing.Vendor AS v
WHERE pv.BusinessEntityID=v.BusinessEntityID
AND StandardPrice > $10
AND Name LIKE N'F%';
Birleştirme SELECT listesi, birleştirilen tablolardaki tüm sütunlara veya sütunların herhangi bir alt kümesine başvurabilir. Liste SELECT , birleştirmedeki her tablodaki sütunları içermek için gerekli değildir. Örneğin, üç tablolu birleşimde, diğer tablolardan birinden üçüncü tabloya köprü oluşturmak için yalnızca bir tablo kullanılabilir ve ortadaki tablodaki sütunların hiçbirine seçme listesinde başvurulmak zorunda değil. Buna anti yarı birleşim de denir.
Birleştirme koşulları genellikle eşitlik karşılaştırmalarına (=) sahip olsa da, diğer koşullar gibi diğer karşılaştırma veya ilişkisel işleçler de belirtilebilir. Daha fazla bilgi için bkz . Karşılaştırma İşleçleri ve WHERE.
SQL Server birleştirmeleri işlediğinde, Sorgu İyileştiricisi birleştirmeyi işlemenin en verimli yöntemini (çeşitli olasılıklar dışında) seçer. Bu, en verimli fiziksel birleştirme türünü, tabloların birleştirileceği sırayı ve hatta yarı birleştirmeler ve yarı birleştirmeler gibi Transact-SQL söz dizimi ile doğrudan ifade edilmeyecek mantıksal birleştirme işlemlerinin türlerini kullanmayı içerir. Çeşitli birleşimlerin fiziksel olarak yürütülmesi birçok farklı iyileştirmeyi kullanabilir ve bu nedenle güvenilir bir şekilde tahmin edilemez. Yarı birleşimler ve yarıya karşı birleşimler hakkında daha fazla bilgi için bkz. Mantıksal ve fiziksel showplan işleç başvurusu.
Birleştirme koşulunda kullanılan sütunların aynı ada veya aynı veri türüne sahip olması gerekmez. Ancak, veri türleri aynı değilse uyumlu veya SQL Server'ın örtük olarak dönüştürebileceği türler olmalıdır. Veri türleri örtük olarak dönüştürülemiyorsa, birleştirme koşulunun işlevini kullanarak veri türünü açıkça dönüştürmesi CAST gerekir. Örtük ve açık dönüştürmeler hakkında daha fazla bilgi için bkz. Veri türü dönüştürme (Veritabanı Altyapısı).
Birleştirme kullanan sorguların çoğu bir alt sorgu (başka bir sorgu içinde iç içe yerleştirilmiş sorgu) kullanılarak yeniden yazılabilir ve çoğu alt sorgu birleştirme olarak yeniden yazılabilir. Alt sorgular hakkında daha fazla bilgi için bkz. Alt Sorgular (SQL Server).
Note
Tablolar ntext, metin veya görüntü sütunlarında doğrudan birleştirilemiyor. Ancak, tablolar SUBSTRING kullanılarak ntext, metin veya görüntü sütunlarında dolaylı olarak birleştirilebilir.
Örneğin, SELECT * FROM t1 JOIN t2 ON SUBSTRING(t1.textcolumn, 1, 20) = SUBSTRING(t2.textcolumn, 1, 20) ve t1tablolarındaki her metin sütununun ilk 20 karakterinde t2 iki tablolu iç birleşim gerçekleştirir.
Ayrıca, iki tablodaki ntext veya metin sütunlarını karşılaştırmak için bir diğer olasılık da sütunların uzunluklarını bir WHERE yan tümceyle karşılaştırmaktır, örneğin: WHERE DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info)
İç içe döngü birleştirmelerini anlama
Bir birleştirme girişi küçükse (10 satırdan az) ve diğer birleştirme girişi oldukça büyükse ve birleştirme sütunlarında dizine eklenmişse, dizin iç içe döngü birleştirmesi en hızlı birleştirme işlemidir çünkü en az G/Ç ve en az karşılaştırma gerektirir.
İç içe döngü birleştirme, iç içe yineleme olarak da adlandırılır, bir birleştirme girişini dış giriş tablosu olarak kullanır (grafik yürütme planında en üst giriş olarak gösterilir) ve diğer bir birleştirme girişini iç (alt) giriş tablosu olarak kullanır. Dış döngü, dış giriş tablosunun satırlarını satır satır tüketir. Her dış satır için yürütülen iç döngü, iç giriş tablosunda eşleşen satırları arar.
En basit durumda, arama bir tablonun veya dizinin tamamını tarar; Buna saf iç içe döngüler birleştirme adı verilir. Arama bir dizinden yararlanıyorsa buna dizin iç içe döngüler birleştirme adı verilir. Dizin sorgu planının bir parçası olarak oluşturulursa (ve sorgu tamamlandıktan sonra yok edilirse), buna geçici dizin iç içe döngü birleştirme adı verilir. Tüm bu değişkenler Sorgu İyileştiricisi tarafından değerlendirilir.
"İç içe döngü birleştirmesi, dış veri küçük olduğunda ve iç veri önceden dizinlenmiş ve büyük olduğunda özellikle etkilidir." Yalnızca küçük bir satır kümesini etkileyenler gibi birçok küçük işlemde, dizin iç içe döngü birleşimleri hem birleştirme hem de karma birleştirmelerden üstündür. Ancak büyük sorgularda iç içe döngü birleşimleri genellikle en uygun seçenek değildir.
İç içe döngü birleştirme operatörünün OPTIMIZED özniteliği True olarak ayarlandığında, iç yan tablo büyük olduğunda, paralel olsun ya da olmasın G/Ç'yi en aza indirmek için Optimize Edilmiş İç İçe Döngüler veya Batch Sıralama kullanıldığı anlamına gelir. Sıralamanın gizli bir işlem olduğu göz önünde bulundurulduğunda, belirli bir planda bu iyileştirmenin varlığı yürütme planı analiz edilirken çok belirgin olmayabilir. Ancak OPTIMIZED özniteliği için plan XML'sine bakarak İç İçe Döngüler birleştirmesinin G/Ç performansını geliştirmek için giriş satırlarını yeniden sıralamaya çalışabileceğini gösterir.
Birleştirme birleştirmeleri
İki birleştirme girişi küçük değilse ancak birleştirme sütunlarında sıralanmışsa (örneğin, sıralanmış dizinler taranarak elde edildiyse), birleştirme birleştirme en hızlı birleştirme işlemidir. Her iki birleştirme girişi de büyükse ve iki girişin boyutları benzerse, önce sıralama ve hash join içeren bir birleştirme, benzer performans sunar. İki giriş boyutu birbirinden önemli ölçüde farklı olduğunda, karma birleştirme işlemleri genellikle çok daha hızlıdır.
Birleştirme birleştirme, birleştirme koşulunun eşitlik (ON) yan tümceleri tarafından tanımlanan birleştirme sütunlarında her iki girişin de sıralanması gerekir. Sorgu iyileştiricisi, uygun sütun kümesinde bir dizin varsa genellikle bir dizini tarar, veya birleştirme birleşiminin altına bir sıralama işleci yerleştirir. Nadir durumlarda, birden çok eşitlik yan tümcesi olabilir, ancak birleştirme sütunları yalnızca kullanılabilir eşitlik yan tümcelerinden alınır.
Her giriş sıralandığından Birleştirme Birleştirme işleci her girişten bir satır alır ve bunları karşılaştırır. Örneğin, iç birleştirme işlemleri için satırlar eşitse geri döndürülür. Eşit değilse, düşük değerli satır atılır ve bu girişten başka bir satır alınır. Bu işlem, tüm satırlar işlenene kadar yineler.
Birleştirme işlemi, ya bire bir ya da çoka çok bir işlemdir. Çoka çok birleştirme, satırları depolamak için geçici bir tablo kullanır. Her girişten tekrarlanan değerler varsa, diğer girişin her tekrar edilen değerini işlerken girişlerden birinin başlangıç noktasına dönmesi gerekir.
Artık koşul varsa, birleştirme koşulunu karşılayan tüm satırlar artık koşulu değerlendirir ve yalnızca onu karşılayan satırlar döndürülür.
Birleştirme birleştirmenin kendisi çok hızlıdır, ancak sıralama işlemleri gerekiyorsa pahalı bir seçim olabilir. Ancak, veri hacmi büyükse ve istenen veriler varolan B ağacı dizinlerinden önceden sıralanmış olarak elde edilebiliyorsa, birleştirme genellikle en hızlı kullanılabilir birleştirme algoritmasıdır.
Karma birleştirmeler
Karma birleşimler büyük, sıralanmamış, dizinlenmemiş girişleri verimli bir şekilde işleyebilir. Karmaşık sorgularda ara sonuçlar için kullanışlıdırlar çünkü:
- Ara sonuçlar dizine eklenmez (açıkça diske kaydedilmediği ve sonra dizine eklenmediği sürece) ve genellikle sorgu planındaki bir sonraki işlem için uygun şekilde sıralanmamıştır.
- Sorgu iyileştiricileri yalnızca ara sonuç boyutlarını tahmin eder. Tahminler karmaşık sorgular için çok yanlış olabileceğinden, ara sonuçları işleme algoritmaları yalnızca verimli olmakla kalmaz, aynı zamanda bir ara sonucun beklenenden çok daha büyük olduğu ortaya çıkarsa düzgün bir şekilde düşmesi gerekir.
Karma eşleme, denormalizasyon kullanımında azalmaya olanak tanır. Normal dışıleştirme genellikle tutarsız güncelleştirmeler gibi yedeklilik tehlikelerine rağmen birleştirme işlemlerini azaltarak daha iyi performans elde etmek için kullanılır. Hash birleştirmeler, denormalizasyon gereksinimini azaltır. Karma birleştirmeler, dikey bölümlemenin (ayrı dosya veya dizinlerdeki tek bir tablodaki sütun gruplarını temsil eder) fiziksel veritabanı tasarımı için uygun bir seçenek haline gelmesine olanak sağlar.
Karma birleştirme işleminin iki girişi vardır: oluşturma girişi ve sondaj girişi. Sorgu iyileştiricisi bu rolleri atar, böylece iki girişten küçük olan oluşturma girdisi olur.
**
Karma birleştirmeler, birçok türde küme eşleştirme işlemleri için kullanılır: iç birleşim; sol dış, sağ dış ve tam dış birleşim; sol ve sağ yarı birleşim; kesişim; birleşim; ve fark. Ayrıca, karma birleştirme işleminin bir varyantı yinelenen öğeleri kaldırma ve gruplama yapabilir, örneğin SUM(salary) GROUP BY department. Bu değişiklikler hem derleme hem de araştırma rolleri için yalnızca bir giriş kullanır.
Aşağıdaki bölümlerde farklı karma birleştirme türleri açıklanmaktadır: bellek içi karma birleştirme, yetkisiz karma birleştirme ve özyinelemeli karma birleştirme.
Bellek içi karma birleştirme
Karma birleştirme önce derleme girişinin tamamını tarar veya hesaplar ve ardından bellekte bir karma tablo oluşturur. Her satır, karma anahtarı için hesaplanan karma değerine bağlı olarak bir karma kovasına yerleştirilir. Derleme girişinin tamamı kullanılabilir bellekten küçükse, karma tabloya tüm satırlar eklenebilir. Bu derleme aşamasını soruşturma aşaması izler. Tüm prob girişi, her seferinde bir satır taranır veya hesaplanır ve her prob satırı için karma anahtarın değeri hesaplanır, karşılık gelen karma demet taranır ve eşleşmeler üretilir.
Grace karmalı birleştirme
Derleme girişi belleğe sığmazsa karma birleştirme işlemi birkaç adımda devam eder. Bu, grace hash join olarak bilinir. Her adımın bir derleme aşaması ve yoklama aşaması vardır. Başlangıçta derleme ve yoklama girişlerinin tamamı kullanılır ve (karma anahtarlarda bir karma işlevi kullanılarak) birden çok dosyaya bölümlenir. Karma anahtarları üzerinde karma işlevinin kullanılması, her iki eşleşen kaydın aynı dosya çiftinde bulunacağını garanti eder. Bu nedenle, iki büyük girişi birleştirme görevi aynı görevlerin birden çok ama daha küçük örneklerine düşürülmüştür. Karma birleştirme daha sonra bölümlenmiş dosyaların her çiftine uygulanır.
Özyinelemeli karma birleştirme
Derleme girdisi, standart bir dış birleştirme için birden çok birleştirme düzeyi gerektirecek kadar büyükse, birden çok bölümleme adımı ve bölümleme düzeyi gerekir. Bölümlerin yalnızca bazıları büyükse, yalnızca belirli bölümler için ek bölümleme adımları kullanılır. Tüm bölümleme adımlarını olabildiğince hızlı hale getirmek amacıyla, büyük ve zaman uyumsuz G/Ç işlemleri kullanılarak, tek bir iş parçacığının birden çok disk sürücüsünü meşgul tutması sağlanır.
Note
Derleme girişi kullanılabilir bellekten yalnızca biraz daha büyükse, bellek içi karma birleştirme ve Grace karma birleştirme öğeleri tek bir adımda birleştirilerek karma birleştirme oluşturulur.
İyileştirme sırasında hangi karma birleştirmenin kullanıldığını belirlemek her zaman mümkün değildir. Bu nedenle SQL Server, bellek içi karma birleştirmeyi kullanarak başlar ve derleme girişinin boyutuna bağlı olarak kademeli olarak zarif karma birleştirme ve özyinelemeli karma birleştirmeye geçiş yapar.
Sorgu İyileştiricisi iki girişten hangisinin daha küçük olduğunu yanlış tahmin ederse ve bu nedenle derleme girişi olması gerekiyorsa derleme ve yoklama rolleri dinamik olarak tersine çevrilir. Karma birleştirme, derleme girişi olarak daha küçük taşma dosyasını kullanmasını sağlar. Bu teknik rol ters çevirme olarak adlandırılır. Rol değişikliği, diske en az bir taşma sonrasında karma birleştirme içinde gerçekleşir.
Note
Rol ters işlemi, sorgu ipuçlarından veya yapısından bağımsız olarak gerçekleşir. Rol ters çevirme sorgu planınızda görüntülenmez; gerçekleştiğinde, kullanıcı için saydamdır.
Karma kurtarma
Hash kurtarma terimi bazen grace karma birleşimlerini veya özyinelemeli karma birleşimlerini açıklamak için kullanılır.
Note
Özyinelemeli karma birleşimleri veya karma kurtarmaları sunucunuzda performansın düşmesine neden olur. Bir izleme günlüğünde birçok Hash Uyarısı olayı görürseniz, birleştirilen sütunlarla ilgili istatistikleri güncelleyin.
Karma kurtarma hakkında daha fazla bilgi için bkz. Karma Uyarı Olay Sınıfı.
Uyarlamalı birleşimler
Toplu iş modu Uyarlamalı Birleştirmeler, karma birleştirme veya iç içe döngüler birleştirme yönteminin seçiminin ilk giriş taranana kadar ertelenebilmesini sağlar. Uyarlamalı Birleştirme işleci, İç İçe Döngüler planına ne zaman geçeceğine karar vermek için kullanılan bir eşik tanımlar. Bu nedenle sorgu planı, yeniden derlenmek zorunda kalmadan yürütme sırasında dinamik olarak daha iyi bir birleştirme stratejisine geçebilir.
Tip
Küçük ve büyük birleşim giriş taramaları arasında sık salınımlara sahip iş yükleri bu özellikten en çok yararlanacaktır.
Çalışma zamanı kararı aşağıdaki adımları temel alır:
- Derleme birleştirme girişinin satır sayısı, İç İçe Döngüler birleştirmesinin Karma birleşimden daha uygun olacağı kadar küçükse, plan İç İçe Döngüler algoritmasına geçer.
- Derleme birleştirme girişi belirli bir satır sayısı eşiğini aşarsa hiçbir değişiklik gerçekleşmez ve planınız Hash birleştirme ile devam eder.
Uyarlamalı Birleştirme örneğini göstermek için aşağıdaki sorgu kullanılır:
SELECT [fo].[Order Key], [si].[Lead Time Days], [fo].[Quantity]
FROM [Fact].[Order] AS [fo]
INNER JOIN [Dimension].[Stock Item] AS [si]
ON [fo].[Stock Item Key] = [si].[Stock Item Key]
WHERE [fo].[Quantity] = 360;
Sorgu 336 satır döndürür. Canlı Sorgu İstatistikleri etkinleştirildiğinde aşağıdaki plan görüntülenir:
Planda aşağıdakilere dikkat edin:
- Karma birleşimi oluşturma aşaması için satır sağlamak amacıyla kullanılan columnstore dizin taraması.
- Yeni Uyarlamalı Birleştirme işleci. Bu işleç, İç İçe Döngüler planına ne zaman geçeceğine karar vermek için kullanılan bir eşiği tanımlar. Bu örnekte eşik 78 satırdır. 78 satır içeren her şey > Karma birleştirme kullanır. Eşikten küçükse, İç İçe Döngüler birleşimi kullanılır.
- Sorgu 336 satır döndürdüğü için bu eşiği aşıyor ve bu nedenle ikinci dal, standart Karma birleştirme işleminin yoklama aşamasını temsil ediyor. Canlı Sorgu İstatistikleri işleçler aracılığıyla akan satırları gösterir. Bu örnekte "672/672".
- Son dal, eğer eşik aşılmamışsa, Nested Loops join için kullanılmak üzere Kümelenmiş Dizin Arama'dır. "0 / 336" satırın görüntülendiğini görüyoruz (dal kullanılmadı).
Şimdi aynı sorgunun planını, ama Quantity değeri tabloda yalnızca bir satıra sahipken karşılaştırın.
SELECT [fo].[Order Key], [si].[Lead Time Days], [fo].[Quantity]
FROM [Fact].[Order] AS [fo]
INNER JOIN [Dimension].[Stock Item] AS [si]
ON [fo].[Stock Item Key] = [si].[Stock Item Key]
WHERE [fo].[Quantity] = 361;
Sorgu bir satır geri döndürür. Canlı Sorgu İstatistikleri etkinleştirildiğinde aşağıdaki plan görüntülenir:
Planda aşağıdakilere dikkat edin:
- Bir satır döndürüldüğünde, Kümelenmiş Dizin Arama'dan artık satırlar akıyor.
- Karma Birleştirme derleme aşaması devam etmediğinden ikinci daldan akan satır yok.
Uyarlamalı Birleştirme açıklamaları
Uyarlamalı birleşimler, dizinlenmiş İç İçe Döngülerle Birleştirme eşdeğer planına göre daha yüksek bellek gereksinimi gösterir. Nested Loops sanki bir Hash join gibi ek bellek ister. Ayrıca, derleme aşaması için bir durdurma ve çalıştırma işlemi ile İç İçe Döngüler akış eşdeğeri birleştirmesi için ek yük vardır. Bu ek maliyet, satır sayısının derleme girişinde dalgalandığı senaryolar için esneklik sağlar.
Toplu modda Uyarlamalı birleşimler, bir deyimin ilk yürütülmesi için çalışır ve derlendiğinde, ardışık yürütmeler, derlenmiş Uyarlamalı Birleştirme eşiğine ve yapı aşamasında dış girişten akan çalışma zamanı satırlarına göre uyarlamalı olarak kalır.
Uyarlamalı Birleştirme bir İç İçe Döngüler işlemine geçerse, Hash Join tarafından oluşturulmuş ve zaten okunmuş olan satırları kullanır. Operatör dış başvuru satırlarını tekrar okumaz.
Uyarlamalı birleştirme etkinliğini izleme
Adaptive Join işleci aşağıdaki plan işleci özniteliklerine sahiptir:
| Plan özniteliği | Description |
|---|---|
| AdaptiveThresholdRows | Hash birleşimden nested loop birleşimine geçmek için kullanılan eşiği gösterir. |
| EstimatedJoinType | Birleştirme türünün ne olma olasılığı vardır? |
| ActualJoinType | Gerçek bir planda, eşiğe göre hangi birleştirme algoritmasının seçildiğini gösterir. |
Tahmini plan, Uyarlamalı Birleştirme planı şeklinin yanı sıra tanımlı Uyarlamalı Birleştirme eşiğini ve tahmini birleştirme türünü gösterir.
Tip
Sorgu Deposu, toplu iş modu Uyarlamalı Birleştirme planını yakalar ve zorla uygulayabilir.
Uyarlamalı birleşim için uygun ifadeler
Birkaç koşul, mantıksal birleştirmeyi toplu iş modu Uyarlamalı Birleştirme için uygun hale getirir:
- Veritabanı uyumluluk düzeyi 140 veya üzeridir.
- Sorgu bir
SELECTdeyimdir (veri değişikliği deyimleri şu anda uygun değildir). - Join, hem dizinli Nested Loops join hem de Hash join algoritması tarafından yürütülmeye uygundur.
- Karma birleştirme, bir columnstore dizininin sorguda genel olarak yer alması, birleşim tarafından doğrudan başvurulan columnstore dizinli bir tablo veya satır deposunda Batch modunun kullanılması aracılığıyla etkinleştirilen Batch modunu kullanır.
- Nested Loops join ve Hash join'in üretilen alternatif çözümleri aynı ilk alt öğeye (dış başvuru) sahip olmalıdır.
Uyarlamalı eşik satırları
Aşağıdaki grafikte, Hash birleştirme maliyeti ile İç İçe Döngü birleştirme alternatifinin maliyeti arasındaki örnek bir kesişim gösterilmektedir. Bu kesişim noktasında eşik, birleştirme işlemi için kullanılan gerçek algoritmayı da belirler.
Uyumluluk düzeyini değiştirmeden Uyarlamalı birleştirmeleri devre dışı bırakma
Uyarlamalı birleşimler, veritabanı uyumluluk düzeyi 140 ve daha yüksek düzeylerde korunurken veritabanı veya deyim kapsamında devre dışı bırakılabilir.
Veritabanından kaynaklanan tüm sorgu yürütmelerinde Uyarlamalı birleştirmeleri devre dışı bırakmak için, geçerli veritabanı bağlamında aşağıdakileri yürütün:
-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_ADAPTIVE_JOINS = ON;
-- Azure SQL Database, SQL Server 2019 and later versions
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ADAPTIVE_JOINS = OFF;
Etkinleştirildiğinde, bu ayar sys.database_scoped_configurations etkin olarak görünür.
Veritabanından kaynaklanan tüm sorgu yürütmeleri için uyarlamalı birleştirmeleri yeniden etkinleştirmek için, geçerli veritabanı bağlamında aşağıdakileri yürütün:
-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_ADAPTIVE_JOINS = OFF;
-- Azure SQL Database, SQL Server 2019 and later versions
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ADAPTIVE_JOINS = ON;
Uyarlamalı birleşimler, DISABLE_BATCH_MODE_ADAPTIVE_JOINS olarak atanarak belirli bir sorgu için de devre dışı bırakılabilir. Örneğin:
SELECT s.CustomerID,
s.CustomerName,
sc.CustomerCategoryName
FROM Sales.Customers AS s
LEFT OUTER JOIN Sales.CustomerCategories AS sc
ON s.CustomerCategoryID = sc.CustomerCategoryID
OPTION (USE HINT('DISABLE_BATCH_MODE_ADAPTIVE_JOINS'));
Note
Sorgu USE HINT ipucu, veritabanı kapsamlı yapılandırma veya izleme bayrağı ayarına göre önceliklidir.
Null değerler ve birleşimler
Birleştirilmekte olan tabloların sütunlarında null değerler olduğunda, null değerler birbiriyle eşleşmiyor. Birleştirilmekte olan tablolardan birinden bir sütunda null değerlerin varlığı yalnızca dış birleşim kullanılarak döndürülebilir (yan tümce null değerleri hariç tutmadığı sürece WHERE ).
Her biri NULL sütununa sahip iki tablo, birleştirmeye katılacak:
table1 table2
a b c d
------- ------ ------- ------
1 one NULL two
NULL three 4 four
4 join4
Sütundaki değerleri sütunla ac karşılaştıran birleştirme, değerlerine NULLsahip sütunlarda eşleşme almaz:
SELECT *
FROM table1 t1 JOIN table2 t2
ON t1.a = t2.c
ORDER BY t1.a;
GO
Yalnızca 4 ve a sütunlarındaki c değerine sahip tek bir satır döndürülür.
a b c d
----------- ------ ----------- ------
4 join4 4 four
(1 row(s) affected)
Temel tablodan döndürülen null değerler, dış birleşimden döndürülen null değerlerden ayırt edilmesi zor olabilir. Örneğin, aşağıdaki SELECT ifadeleri bu iki tabloda sol dış bağlantı yapar:
SELECT *
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.a = t2.c
ORDER BY t1.a;
GO
Sonuç kümesi aşağıdadır.
a b c d
----------- ------ ----------- ------
NULL three NULL NULL
1 one NULL NULL
4 join4 4 four
(3 row(s) affected)
Sonuçlar, verilerdeki bir NULL öğesini birleştirme hatasını temsil eden bir NULL ile ayırt etmek kolay değildir. Birleştirilen verilerde değerler mevcut olduğunda NULL , genellikle normal birleştirme kullanarak bunları sonuçlardan atlayarak tercih edilir.
İlgili içerik
- Mantıksal ve Fiziksel Showplan İşleç Referansı
- Karşılaştırma İşleçleri (Transact-SQL)
- Veri türü dönüştürme (Veritabanı Altyapısı)
- Alt Sorgular (SQL Server)
- Uyarlamalı Birleşimler
- FROM ifadesi artı JOIN, APPLY, PIVOT (Transact-SQL)