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.
Bu makalede, PolyBase sorgusunun dış veri kaynağına gönderimden yararlanılıp yararlanmadığının nasıl belirleneceği açıklanmaktadır. Dış pushdown hakkında daha fazla bilgi için bkz. PolyBase'de pushdown hesaplamaları.
Sorgum external pushdown'dan yararlanıyor mu?
İtme hesaplaması, dış veri kaynaklarında sorguların performansını artırır. Bazı hesaplama görevleri SQL Server örneğine getirilmek yerine dış veri kaynağına devredilir. Özellikle filtreleme ve birleştirme itelemesi durumlarında, SQL Server örneğindeki iş yükü büyük ölçüde azaltılabilir.
PolyBase anında iletme hesaplaması sorgunun performansını önemli ölçüde artırabilir. Bir PolyBase sorgusu yavaş çalışıyorsa, PolyBase sorgunuzun pushdown işlemi yapılıp yapılmadığını kontrol edin.
Yürütme planında aşağı itme işlemini üç farklı senaryoda gözlemleyebilirsiniz:
- Filtre koşulu anında iletme
- Pushdown'a katıl
- Toplama işleminde öne çekme
SQL Server 2019'un (15.x) iki yeni özelliği, yöneticilerin dış veri kaynağına bir PolyBase sorgusu gönderilip gönderilmediğini belirlemesine olanak tanır:
- İzleme bayrağı 6408 ile Tahmini Yürütme Planı'nı görüntüleyin
-
read_commandöğesini, sys.dm_exec_external_work dinamik yönetim görünümünde görüntüleyin
Bu makalede, her birinin üçer senaryoda kullanılmasına dair iki farklı kullanım örneğinin detayları sağlanmaktadır.
Sınırlamalar
Aşağıdaki kısıtlamalar PolyBase'deki pushdown hesaplamalarıyla dış veri kaynaklarına iletebileceğiniz işlemleri etkiler.
Bazı T-SQL işlevleri, aşağı göndermeyi engelleyebilir. Daha fazla bilgi için bkz . PolyBase özellikleri ve sınırlamaları.
Aksi halde aşağı gönderilebilen T-SQL işlevlerinin listesi için bkz. PolyBaseiçindeki Pushdown hesaplamaları.
İzleme bayrağı 6408'i kullan
Varsayılan olarak, tahmini yürütme planı uzak sorgu planını kullanıma sunmaz. Yalnızca uzak sorgu işleci nesnesini görürsünüz. Örneğin, SQL Server Management Studio'dan (SSMS) tahmini yürütme planı:
SQL Server 2019'dan (15.x) başlayarak, DBCC TRACEONkullanarak genel olarak yeni bir izleme bayrağı 6408'i etkinleştirebilirsiniz. Mesela:
DBCC TRACEON (6408, -1);
Bu izleme bayrağı yalnızca tahmini yürütme planlarıyla çalışır ve gerçek yürütme planları üzerinde hiçbir etkisi yoktur. Bu izleme bayrağı, Uzak Sorgu işleci hakkında ve Uzak Sorgu aşamasında ne olduğunu gösteren bilgileri açığa çıkarır.
Yürütme planına genel bakış , okların yönüyle gösterildiği gibi sağdan sola okunur. Bir işleç başka bir işlecin sağındaki ise, ondan öncedir . Bir işleç başka bir işlecin solundaysa, bu işlecin peşindedir .
- SSMS'de sorguyu vurgulayın ve araç çubuğundan Tahmini Yürütme Planını Görüntüle'yi seçin veya Ctrl+L tuşunu kullanın.
Aşağıdaki örneklerin her biri SSMS çıktısını içerir.
Filtre koşulunun öne alınması (yürütme planıyla görüntüleme)
WHERE yan tümcesinde bir filtre koşulu kullanan aşağıdaki sorguyu göz önünde bulundurun:
SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;
Filtre koşulu aşağı itilirse, filtre işleci yürütme planındaki dış işleçten önce görünür. Filtre işleci dış işleçten önce olduğunda, filtreleme sorgu altyapısı dış veri kaynağından veri almadan önce gerçekleşir ve bu da filtre koşulunun aşağı gönderildiği anlamına gelir.
Filtre koşulunun aşağı itme işlemiyle (yürütme planıyla görüntüleme)
İzleme bayrağı 6408'i etkinleştirdiğinizde, tahmini yürütme planı çıkışında ek bilgiler görürsünüz.
SSMS'de, uzak sorgu planı tahmini yürütme planında Sorgu 2 (sp_execute_memo_node_1) olarak görünür. Sorgu 1'deki Uzak Sorgu işlecine karşılık gelir. Mesela:
Filtre koşulunun gönderilmesi olmadan (yürütme planıyla görüntüleme)
Filtre öncülü aşağı taşınmazsa, filtre işleci dış işleçten sonra görüntülenir.
SSMS'den tahmini yürütme planı:
JOIN operasyonunun indirgenmesi
Aynı dış veri kaynağındaki JOIN iki dış tablo için işlecini kullanan aşağıdaki sorguyu göz önünde bulundurun:
SELECT be.BusinessEntityID,
bea.AddressID
FROM [Person].[BusinessEntity] AS be
INNER JOIN [Person].[BusinessEntityAddress] AS bea
ON be.BusinessEntityID = bea.BusinessEntityID;
Sorgu motoru JOIN operasyonunu dış veri kaynağına gönderdiyse, Join operatörü dış operatörden önce görünür. Bu örnekte hem [BusinessEntity] hem de [BusinessEntityAddress] dış tablolardır.
Birleştirmenin aşağı itmesiyle (yürütme planıyla görüntüleme)
SSMS'den tahmini yürütme planı:
Birleştirme itme olmaksızın (yürütme planıyla görüntüleme)
Sorgu motoru JOIN işlemini dış veri kaynağına göndermezse, Join işleci dış işlemciden sonra görünür. SSMS'de sp_execute_memo_node için sorgu planı, dış operatörü içerir. Bu işleç, Sorgu 1'deki Uzak Sorgu işlecinin bir parçasıdır.
SSMS'den tahmini yürütme planı:
Toplamanın aşağı itilmesi (yürütme planıyla görüntüleme)
Toplama işlevi kullanan aşağıdaki sorguyu göz önünde bulundurun:
SELECT SUM([Quantity]) AS Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];
Toplamanın aşağı itilmesiyle (yürütme planıyla görüntüleme)
Toplama aşağı doğru aktarılırsa, toplama işleci dış işleçten önce görünür. Toplama işleci dış işleçten önce olduğunda, sorgu toplama işlemini dış veri kaynağından veri seçmeden önce gerçekleştirir ve bu da toplamanın aşağı gönderildiği anlamına gelir.
SSMS'den tahmini yürütme planı:
Toplamanın aşağı inmesi olmadan (yürütme planıyla görüntüleme)
Toplama aşağı gönderilmezse toplama işleci dış işlecin peşindedir.
SSMS'den tahmini yürütme planı:
DMV kullanma
SQL Server 2019 (15.x) ve sonraki sürümlerinde read_command, sys.dm_exec_external_work DMV sütunu dış veri kaynağına gönderdiğiniz sorguyu gösterir. İtme işleminin gerçekleşip gerçekleşmediğini belirleyebilirsiniz, ancak yürütme planını kullanıma sunmaz. Uzak sorguyu görüntülemek için izleme bayrağı 6408 gerekmez.
Not
Hadoop ve Azure depolama için read_command her zaman NULLdöndürür.
Aşağıdaki sorguyu çalıştırın ve araştırdığınız sorguyu start_time/end_time tanımlamak için ve read_command değerlerini kullanın:
SELECT execution_id,
start_time,
end_time,
read_command
FROM sys.dm_exec_external_work
ORDER BY execution_id DESC;
Not
sys.dm_exec_external_work yönteminin read_command bir sınırlaması, DMV'deki alanın 4.000 karakterle sınırlı olmasıdır. Sorgu yeterince uzunsa, read_command içinde read_command kesilebilir ve WHERE, JOIN veya toplama işlevini görmeden önce kesilebilir.
Filtre koşulunun aşağı itme (DMV ile görüntüleme)
Önceki filtre koşulu örneğinde kullanılan sorguyu göz önünde bulundurun:
SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;
Filtrenin aşağı itmesiyle (DMV ile görüntüleme)
Filtre koşulunun read_command aşağı itilip itilmediğini görmek için DMV'yi kontrol edebilirsiniz. Aşağıdaki sorguya benzer bir örnek görürsünüz:
SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID],
[T1_1].[rowguid] AS [rowguid],
[T1_1].[ModifiedDate] AS [ModifiedDate]
FROM (SELECT [T2_1].[BusinessEntityID] AS [BusinessEntityID],
[T2_1].[rowguid] AS [rowguid],
[T2_1].[ModifiedDate] AS [ModifiedDate]
FROM [AdventureWorks2022].[Person].[BusinessEntity] AS T2_1
WHERE ([T2_1].[BusinessEntityID] = CAST ((17907) AS INT))) AS T1_1;
Dış veri kaynağına gönderilen komut yan tümcesini WHERE içerir; bu da filtre koşulunun dış veri kaynağında değerlendirildiği anlamına gelir. Veri kümesinde filtreleme dış veri kaynağında gerçekleşir ve PolyBase yalnızca filtrelenmiş veri kümesini alır.
Filtre uygulaması olmadan (DMV ile görüntüleme)
Aşağı itme gerçekleşmiyorsa şunun gibi bir şey görürsünüz:
SELECT "BusinessEntityID",
"rowguid",
"ModifiedDate"
FROM "AdventureWorks2022"."Person"."BusinessEntity";
Dış veri kaynağına gönderilen komut bir WHERE yan tümce içermez, bu nedenle filtre koşulu aşağı gönderilmez. PolyBase veri kümesini aldıktan sonra veri kümesinin tamamında filtreleme SQL Server tarafında gerçekleşir.
JOIN işleminde aşağı iletme (DMV ile görüntüleme)
Önceki JOIN örnekte kullanılan sorguyu göz önünde bulundurun:
SELECT be.BusinessEntityID,
bea.AddressID
FROM [Person].[BusinessEntity] AS be
INNER JOIN [Person].[BusinessEntityAddress] AS bea
ON be.BusinessEntityID = bea.BusinessEntityID;
Birleştirmenin aşağı itmesiyle (DMV ile görüntüleme)
öğesini dış veri kaynağına iterseniz JOIN şunun gibi bir şey görürsünüz:
SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID],
[T1_1].[AddressID] AS [AddressID]
FROM (SELECT [T2_2].[BusinessEntityID] AS [BusinessEntityID],
[T2_1].[AddressID] AS [AddressID]
FROM [AdventureWorks2022].[Person].[BusinessEntityAddress] AS T2_1
INNER JOIN [AdventureWorks2022].[Person].[BusinessEntity] AS T2_2
ON ([T2_1].[BusinessEntityID] = [T2_2].[BusinessEntityID])) AS T1_1;
Dış veri kaynağına gönderdiğiniz komut, JOIN ifadesini içerdiğinden JOIN aşağıya çekilir. Dış veri kaynağı veri kümesindeki birleştirmeyi işler ve PolyBase yalnızca birleştirme koşuluyla eşleşen veri kümesini alır.
Birleştirme indirme olmadan (DMV ile görüntüleme)
Birleştirmenin gönderimi gerçekleşmiyorsa, dış veri kaynağında yürütülen iki farklı sorgu görürsünüz:
SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID],
[T1_1].[AddressID] AS [AddressID]
FROM [AdventureWorks2022].[Person].[BusinessEntityAddress] AS T1_1;
SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID]
FROM [AdventureWorks2022].[Person].[BusinessEntity] AS T1_1;
POLYBase her iki veri kümesini de aldıktan sonra SQL Server tarafı iki veri kümesini birleştirmeyi işler.
Toplama işleminin aşağıya doğru aktarılması (DMV ile görüntüleme)
Toplama işlevi kullanan aşağıdaki sorguyu göz önünde bulundurun:
SELECT SUM([Quantity]) AS Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];
Toplamanın aşağı itilmesiyle (DMV ile görüntüleme)
Toplamanın aşağı itilmesi gerçekleşiyorsa, içinde toplama işlevini read_commandgörürsünüz. Mesela:
SELECT [T1_1].[col] AS [col]
FROM (SELECT SUM([T2_1].[Quantity]) AS [col]
FROM [AdventureWorks2022].[Production].[ProductInventory] AS T2_1) AS T1_1;
Toplama işlevi dış veri kaynağına gönderilen komuttadır, bu nedenle toplama aşağı gönderilir. Toplama dış veri kaynağında gerçekleşir ve PolyBase yalnızca toplanan veri kümesini alır.
Toplamanın aşağı inmesi olmadan (DMV ile görünüm)
Eğer toplamanın aşağı itilmesi gerçekleşmiyorsa, read_command içinde toplama işlevini görmezsiniz. Mesela:
SELECT "Quantity"
FROM "AdventureWorks2022"."Production"."ProductInventory";
PolyBase, toplanmamış veri kümesini alır ve SQL Server toplamayı gerçekleştirir.