Jak zjistit, jestli došlo k externímu snížení úrovně

Tento článek vysvětluje, jak určit, zda dotaz PolyBase má prospěch z pushdownu do externího zdroje dat. Další informace o externím pushdownu najdete v tématu Výpočty v PolyBase.

Má můj dotaz výhod externího nabízení?

Zpracování s využitím pushdown zlepšuje výkon dotazů na externí zdroje dat. Některé výpočetní úlohy se místo přenesení do instance SQL Serveru delegují na externí zdroj dat. Zejména v případech filtrování a přenesení spojení může být zátěž na instanci SQL Serveru výrazně snížena.

PolyBase pushdown výpočet může výrazně zlepšit výkon dotazu. Pokud dotaz PolyBase provádí pomalu, zkontrolujte, jestli dochází k posunu dotazu PolyBase.

Posun v plánu provádění můžete sledovat ve třech různých scénářích:

  • Využití predikátu filtru pro efektivnější zpracování dat
  • Připojit se ke snižování
  • Optimalizace agregace

Dvě nové funkce SQL Serveru 2019 (15.x) umožňují správcům určit, jestli se dotaz PolyBase odesílá do externího zdroje dat:

Tento článek obsahuje podrobnosti o tom, jak používat každý z těchto dvou případů použití pro každý ze tří scénářů prosazení.

Omezení

Následující omezení ovlivňují to, co můžete předat do externích zdrojů dat pomocí výpočtů pushdown v PolyBase:

Použijte příznak trasování 6408

Ve výchozím nastavení odhadovaný plán provádění nezpřístupňuje plán vzdáleného dotazu. Zobrazí se pouze objekt operátoru vzdáleného dotazu. Například odhadovaný plán provádění ze sady SQL Server Management Studio (SSMS):

Snímek obrazovky s odhadovaným plánem provádění v nástroji SSMS

Počínaje SQL Serverem 2019 (15.x) můžete globálně povolit nový příznak trasování 6408 pomocí DBCC TRACEON. Například:

DBCC TRACEON (6408, -1);

Tento příznak trasování funguje pouze s odhadovanými plány provádění a nemá žádný vliv na skutečné plány provádění. Tento příznak trasování zveřejňuje informace o operátoru vzdáleného dotazu, který ukazuje, co se stane během fáze zpracování vzdáleného dotazu.

Přehled plánu provádění se čte zprava doleva, jak ukazuje směr šipek. Pokud je operátor napravo od jiného operátoru, je za ním. Pokud je operátor nalevo od jiného operátoru, je za ním.

  • V nástroji SSMS zvýrazněte dotaz a na panelu nástrojů vyberte Zobrazit odhadovaný plán provádění nebo použijte ctrl+L.

Každý z následujících příkladů zahrnuje výstup z aplikace SSMS.

Posun predikátu filtru (zobrazení s plánem provádění)

Představte si následující dotaz, který v klauzuli WHERE používá predikát filtru:

SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;

Pokud je predikát filtru propagován dolů, objeví se operátor filtru před externím operátorem v prováděcím plánu. Pokud je operátor filtru před externím operátorem, filtrování proběhne dříve, než dotazovací modul načte data z externího zdroje dat, což znamená, že predikát filtru je vložen.

S odsdílením predikátu filtru (zobrazení s plánem provádění)

Když povolíte příznak trasování 6408, zobrazí se v odhadovaném výstupu plánu provádění další informace.

V nástroji SSMS se plán vzdáleného dotazu zobrazí jako dotaz 2 (sp_execute_memo_node_1) v odhadovaném plánu provádění. Odpovídá operátoru vzdáleného dotazu v dotazu 1. Například:

Snímek obrazovky s plánem provádění s posunem predikátu filtru z aplikace SSMS

Bez přenesení predikátu filtru (prohlédnutí s prováděcím plánem)

Pokud predikát filtru není posunut, zobrazí se za externím operátorem operátor filtru.

Odhadovaný plán provádění z SSMS:

Snímek obrazovky s plánem provádění bez posunu predikátu filtru ze služby SSMS

Snížení úrovně zpracování spojení

Představte si následující dotaz, který používá JOIN operátor pro dvě externí tabulky ve stejném externím zdroji dat:

SELECT be.BusinessEntityID,
       bea.AddressID
FROM [Person].[BusinessEntity] AS be
     INNER JOIN [Person].[BusinessEntityAddress] AS bea
         ON be.BusinessEntityID = bea.BusinessEntityID;

Pokud dotazovací modul odešle JOIN operaci do externího zdroje dat, zobrazí se operátor Join před externím operátorem. V tomto příkladu jsou externí tabulky [BusinessEntity] i [BusinessEntityAddress].

S využitím pushdownu spojení (zobrazení s plánem provádění)

Odhadovaný plán provádění z SSMS:

Snímek obrazovky s plánem provádění se zatlačením spojení z SQL Server Management Studio

Bez přenosu spojení (zobrazení s plánem provádění)

Pokud dotazovací modul neprosadí JOIN operaci do externího zdroje dat, operátor Spojení se objeví za externím operátorem. V nástroji SSMS zahrnuje plán sp_execute_memo_node dotazu externí operátor. Tento operátor je součástí operátoru vzdáleného dotazu v dotazu 1.

Odhadovaný plán provádění z SSMS:

Snímek obrazovky s plánem provádění bez join pushdown ze SSMS.

Posun agregace (zobrazení s plánem provádění)

Představte si následující dotaz, který používá agregační funkci:

SELECT SUM([Quantity]) AS Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];

S posunem agregace (zobrazení s plánem provádění)

Pokud je agregace posunutá dolů, zobrazí se operátor agregace před externím operátorem. Pokud je operátor agregace před externím operátorem, provede dotaz agregaci před výběrem dat z externího zdroje dat, což znamená, že se agregace přenese dolů.

Odhadovaný plán provádění z SSMS:

Snímek obrazovky s plánem provádění s agregovaným odsdílením změn ze služby SSMS

Bez poklesu agregace (zobrazení s plánem provádění)

Pokud agregace není posunutá dolů, operátor agregace je za externím operátorem.

Odhadovaný plán provádění z SSMS:

Snímek plánu provedení bez projekce agregace z SSMS

Použijte DMV

Ve verzích SQL Serveru 2019 (15.x) a novějších se ve sloupci sys.dm_exec_external_work zobrazení dynamické správy zobrazí dotaz, který odešlete do externího zdroje dat. Můžete zjistit, zda dochází k optimalizaci pomocí pushdownu, ale nezpřístupňuje to plán provádění. K zobrazení vzdáleného dotazu nepotřebujete trasovací příznak 6408.

Poznámka

V případě hadoopu a úložiště Azure read_command vždy vrací NULL.

Spusťte následující dotaz a pomocí start_time/end_time hodnot read_command identifikujte dotaz, který prošetřujete:

SELECT execution_id,
       start_time,
       end_time,
       read_command
FROM sys.dm_exec_external_work
ORDER BY execution_id DESC;

Poznámka

Jedním z omezení metody sys.dm_exec_external_work je, že pole read_command v zobrazení dynamické správy je omezeno na 4 000 znaků. Pokud je dotaz dostatečně dlouhý, read_command může být zkrácen před zobrazením WHERE, JOIN nebo agregační funkce v read_command.

Posun predikátu filtru (zobrazení s DMV)

Představte si dotaz použitý v předchozím příkladu predikátu filtru:

SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;

S odsadnutím filtru (zobrazení s dmV)

V zobrazení dynamické správy můžete zkontrolovat read_command , jestli dochází k posunu predikátu filtru. Zobrazí se podobný příklad jako v následujícím dotazu:

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;

Příkaz odeslaný do externího zdroje dat obsahuje WHERE klauzuli, což znamená, že predikát filtru se vyhodnocuje na externím zdroji dat. Filtrování datové sady probíhá v externím zdroji dat a PolyBase načte pouze filtrovanou datovou sadu.

Bez odsunutí filtru (zobrazení s DMV)

Pokud k odsunutí nedochází, zobrazí se něco takového:

SELECT "BusinessEntityID",
       "rowguid",
       "ModifiedDate"
FROM "AdventureWorks2022"."Person"."BusinessEntity";

Příkaz odeslaný do externího zdroje dat neobsahuje WHERE klauzuli, takže predikát filtru není přesunut dolů. Filtrování celé datové sady probíhá na straně SQL Serveru po načtení datové sady PolyBase.

Odsadení funkce JOIN (zobrazení s zobrazením dynamické správy)

Představte si dotaz použitý v předchozím JOIN příkladu:

SELECT be.BusinessEntityID,
       bea.AddressID
FROM [Person].[BusinessEntity] AS be
     INNER JOIN [Person].[BusinessEntityAddress] AS bea
         ON be.BusinessEntityID = bea.BusinessEntityID;

S prosunutím spojení (zobrazení s DMV)

Pokud přenesete JOIN dolů k externímu zdroji dat, uvidíte něco takového:

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;

Příkaz, který odešlete do externího zdroje dat, obsahuje JOIN klauzuli, takže JOIN se posune dolů. Externí zdroj dat zpracovává spojení v datové sadě a PolyBase načte pouze datovou sadu, která odpovídá podmínce spojení.

Bez optimalizace spojení (zobrazení s DMV)

Pokud k prosazení spojení nedojde, zobrazí se dva různé dotazy spuštěné u externího zdroje dat.

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;

SQL Server se postará o spojení obou datových sad poté, co je PolyBase načte.

Posun agregace (zobrazení s zobrazením dynamické správy)

Představte si následující dotaz, který používá agregační funkci:

SELECT SUM([Quantity]) AS Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];

S efektivnějším zpracováním agregace (zobrazení s DMV)

Pokud dochází k pushdownu agregace, zobrazí se funkce agregace v rámci read_command. Například:

SELECT [T1_1].[col] AS [col]
FROM (SELECT SUM([T2_1].[Quantity]) AS [col]
      FROM [AdventureWorks2022].[Production].[ProductInventory] AS T2_1) AS T1_1;

Agregační funkce je v příkazu odeslaném do externího zdroje dat, takže je agregace posunutá dolů. Agregace probíhá u externího zdroje dat a PolyBase načte pouze agregovanou datovou sadu.

Bez odsouvání agregace (zobrazení s DMV)

Pokud k odsunutí agregace nedochází, nevidíte funkci agregace v read_command. Například:

SELECT "Quantity"
FROM "AdventureWorks2022"."Production"."ProductInventory";

PolyBase načte neagregovanou datovou sadu a SQL Server provede agregaci.