Harici baskının meydana gelip gelmediğini belirleme

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.

İ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ı:

SSMS'de tahmini yürütme planının ekran görüntüsü.

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:

SSMS'den filtre koşulu gönderimi içeren bir yürütme planının ekran görüntüsü.

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ı:

SSMS'den filtre koşulu gönderimi içermeyen bir yürütme planının ekran görüntüsü.

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ı:

SSMS'den gelen birleştirme gönderimi ile yürütme planının ekran görüntüsü.

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ı:

SSMS'den join pushdown olmadan bir yürütme planının ekran görüntüsü.

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ı:

SSMS'den toplu gönderim içeren bir yürütme planının ekran görüntüsü.

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ı:

SSMS'den toplu geri gönderme olmadan yürütme planının ekran görüntüsü.

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.