Hoe kunt u zien of er een extern(e) pushdown is opgetreden?
In dit artikel wordt beschreven hoe u kunt bepalen of een PolyBase-query profiteert van pushdown naar de externe gegevensbron. Zie pushdownberekeningen in PolyBasevoor meer informatie over externe pushdownberekeningen.
Profiteert mijn query van externe pushdown-functionaliteit?
Pushdownberekening verbetert de prestaties van query's op externe gegevensbronnen. Bepaalde rekentaken worden gedelegeerd aan de externe gegevensbron in plaats van naar de SQL Server te worden gebracht. Met name in het geval van het filteren en het samenvoegen via pushdown kan de workload op de SQL Server-instantie aanzienlijk worden verminderd.
PolyBase-pushdownberekeningen kunnen de prestaties van de query aanzienlijk verbeteren. Als een PolyBase-query langzaam wordt uitgevoerd, moet u bepalen of de pushdown van uw PolyBase-query plaatsvindt.
Er zijn drie verschillende scenario's waarbij pushdown kan worden waargenomen in het uitvoeringsschema.
- Filterpredicaatpushdown
- Pushdown samenvoegen
- Aggregatiepushdown
Notitie
Er gelden beperkingen op wat naar externe gegevensbronnen kan worden overgedragen met PolyBase-pushdownberekeningen:
- Sommige T-SQL-functies kunnen pushdown voorkomen. Zie PolyBase-functies en -beperkingenvoor meer informatie.
- Zie Pushdown-berekeningen in PolyBasevoor een lijst met T-SQL-functies die anders omlaag kunnen worden gepusht.
Er zijn twee nieuwe functies van SQL Server 2019 (15.x) geïntroduceerd zodat beheerders kunnen bepalen of een PolyBase-query naar de externe gegevensbron wordt gepusht:
- Bekijk het geschatte uitvoeringsplan met traceringsvlag 6408
- De
read_command
weergeven in de sys.dm_exec_external_work dynamische beheerweergave
In dit artikel vindt u meer informatie over het gebruik van elk van deze twee use cases voor elk van de drie pushdownscenario's.
TF6408 gebruiken
Standaard wordt in het geschatte uitvoeringsplan het externe queryplan niet weergegeven en ziet u alleen het operatorobject voor externe query's. Bijvoorbeeld een geschat uitvoeringsplan van SQL Server Management Studio (SSMS):
Oftewel in Azure Data Studio:
Vanaf SQL Server 2019 (15.x) kunt u wereldwijd een nieuwe traceringsvlag 6408 inschakelen met behulp van DBCC TRACEON-. Bijvoorbeeld:
DBCC TRACEON (6408, -1);
Deze traceringsvlag werkt alleen met geschatte uitvoeringsplannen en heeft geen effect op werkelijke uitvoeringsplannen. Deze traceringsvlag geeft informatie weer over de Remote Query-operator en laat zien wat er gebeurt tijdens de Remote Query-fase.
uitvoeringsplannen worden van rechts naar links gelezen, zoals aangegeven door de richting van de pijlen. Als een operator zich rechts van een andere operator bevindt, wordt gezegd dat deze eraan voorafgaat. Als een operator zich links van een andere operator bevindt, wordt dat 'erachter' genoemd.
- Markeer in SSMS de query en selecteer Geschatte uitvoeringsplan weergeven op de werkbalk of gebruik Ctrl+L-.
- Markeer de query in Azure Data Studio en selecteer Uitleg. Bekijk vervolgens de volgende scenario's om te bepalen of pushdown heeft plaatsgevonden.
Elk van de onderstaande voorbeelden bevat de uitvoer van SSMS en Azure Data Studio.
Pushdown van filterpredicaat (weergave met uitvoeringsplan)
Houd rekening met de volgende query, die gebruikmaakt van een filterpredicaat in de WHERE-component:
SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;
Als de pushdown van het filterpredicaat plaatsvindt, bevindt de filteroperator zich vóór de externe operator. Wanneer de filteroperator zich vóór de externe operator bevindt, vindt het filteren plaats voordat de selectie uit de externe gegevensbron wordt gehaald, wat aangeeft dat het filterpredicaat is toegepast.
Met pushdown van filtervoorwaarde (weergave met uitvoeringsplan)
Nu traceringsvlag 6408 is ingeschakeld, ziet u nu aanvullende informatie in de geschatte uitvoer van het uitvoeringsplan. De uitvoer varieert tussen SSMS en Azure Data Studio.
In SSMS wordt het externe queryplan weergegeven in het geschatte uitvoeringsplan als Query 2 (sp_execute_memo_node_1
) en komt overeen met de operator Externe query in Query 1. Bijvoorbeeld:
In Azure Data Studio wordt de uitvoering van externe query's in plaats daarvan weergegeven als één queryplan. Bijvoorbeeld:
Zonder pushdown van filtervoorwaarde (weergave met uitvoeringsplan)
Als er geen pushdown van het filterpredicaat optreedt, is het filter na de externe operator.
Het geschatte uitvoeringsplan van SSMS:
Het geschatte uitvoeringsplan van Azure Data Studio:
Pushdown van JOIN
Houd rekening met de volgende query die gebruikmaakt van de JOIN-operator voor twee externe tabellen in dezelfde externe gegevensbron:
SELECT be.BusinessEntityID, bea.AddressID
FROM [Person].[BusinessEntity] AS be
INNER JOIN [Person].[BusinessEntityAddress] AS bea
ON be.BusinessEntityID = bea.BusinessEntityID;
Als de JOIN naar de externe gegevensbron wordt gepusht, zal de Join-operator voor de externe operator staan. In dit voorbeeld zijn zowel [BusinessEntity]
als [BusinessEntityAddress]
externe tabellen.
Met pushdown van join (weergave met uitvoeringsplan)
Het geschatte uitvoeringsplan van SSMS:
Het geschatte uitvoeringsplan van Azure Data Studio:
Zonder pushdown van join (weergave met uitvoeringsplan)
Als de JOIN niet naar de externe gegevensbron wordt gepusht, bevindt de joinoperator zich na de externe operator. In SSMS bevindt de externe operator zich in het queryplan voor sp_execute_memo_node
, dat zich in de operator Remote Query in Query 1 bevindt. In Azure Data Studio is de join-operator na de externe operator(s).
Het geschatte uitvoeringsplan van SSMS:
Het geschatte uitvoeringsplan van Azure Data Studio:
Pushdown van aggregatie (weergave met uitvoeringsplan)
Houd rekening met de volgende query, die gebruikmaakt van een statistische functie:
SELECT SUM([Quantity]) as Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];
Met doordrukken van aggregatie (weergave met uitvoeringsplan)
Als er een pushdown van de aggregatie plaatsvindt, bevindt de aggregatieoperator zich vóór de externe operator. Wanneer de aggregatieoperator zich vóór de externe operator bevindt, is de aggregatie uitgevoerd voordat deze vanuit de externe gegevensbron werd opgevraagd, wat aangeeft dat de aggregatie naar beneden is doorgeschoven.
Het geschatte uitvoeringsplan van SSMS:
Het geschatte uitvoeringsplan van Azure Data Studio:
Zonder pushdown van aggregatie (weergave met uitvoeringsplan)
Als er geen pushdown van de aggregatie plaatsvindt, is de aggregatieoperator na de externe operator.
Het geschatte uitvoeringsplan van SSMS:
Het geschatte uitvoeringsplan van Azure Data Studio:
DMV gebruiken
In sql Server 2019 (15.x) en nieuwere versies toont de read_command
kolom van sys.dm_exec_external_work DMV de query die naar de externe gegevensbron wordt verzonden. Hiermee kunt u bepalen of er pushdown plaatsvindt, maar het geeft het uitvoeringsplan niet weer. Voor het weergeven van de externe query is GEEN TF6408 vereist.
Notitie
Voor Hadoop- en Azure-opslag retourneert de read_command
altijd NULL
.
U kunt de volgende query uitvoeren en de start_time
/end_time
en read_command
gebruiken om de query te identificeren die wordt onderzocht:
SELECT execution_id, start_time, end_time, read_command
FROM sys.dm_exec_external_work
ORDER BY execution_id desc;
Notitie
Een beperking van de sys.dm_exec_external_work methode is dat het read_command
veld in de DMV is beperkt tot 4000 tekens. Als de query voldoende lang is, wordt de read_command
mogelijk afgekapt voordat u de functie WHERE/JOIN/aggregatie in de read_command
ziet.
Pushdown van filterpredicaat (weergave met DMV)
Bekijk de query die in het vorige filterpredicaatvoorbeeld wordt gebruikt:
SELECT *
FROM [Person].[BusinessEntity] be
WHERE be.BusinessEntityID = 17907;
Met pushdown van het filter (weergave met DMV)
U kunt zien of de pushdown van het filterpredicaat plaatsvindt door de read_command
in de DMV te controleren. U ziet zoiets als dit voorbeeld:
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;
De WHERE-component bevindt zich in de opdracht die wordt verzonden naar de externe gegevensbron, wat betekent dat het filterpredicaat wordt geëvalueerd bij de externe gegevensbron. Filteren op de gegevensset vond plaats in de externe gegevensbron, en alleen de gefilterde gegevensset werd opgehaald door PolyBase.
Zonder pushdown van filter (weergave met DMV)
Als er geen pushdown plaatsvindt, zult u iets als het volgende zien:
SELECT "BusinessEntityID","rowguid","ModifiedDate" FROM "AdventureWorks2022"."Person"."BusinessEntity"
Er is geen WHERE-component in de opdracht die naar de externe gegevensbron wordt verzonden, dus het filterpredicaat wordt niet omlaag gepusht. Filteren over de gehele dataset is door SQL Server uitgevoerd, nadat de dataset door PolyBase is opgehaald.
Pushdown van JOIN (met weergave via DMV)
Bekijk de query die in het vorige JOIN-voorbeeld wordt gebruikt:
SELECT be.BusinessEntityID, bea.AddressID
FROM [Person].[BusinessEntity] be
INNER JOIN [Person].[BusinessEntityAddress] bea ON be.BusinessEntityID = bea.BusinessEntityID;
Met verplaatsing van samenvoeging (weergave met DMV)
Als de JOIN naar de externe gegevensbron wordt doorgeschoven, ziet u iets als:
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;
De JOIN-component bevindt zich in de opdracht die naar de externe gegevensbron wordt verzonden, dus de JOIN wordt omlaag gepusht. De join van de gegevensset heeft plaatsgevonden in externe gegevensbron en alleen de gegevensset die aan de joinvoorwaarde voldoet is binnengesleept door PolyBase.
Zonder pushdown van join (weergave met DMV)
Als de pushdown van de join niet plaatsvindt, ziet u dat er twee verschillende query's worden uitgevoerd op de externe gegevensbron:
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;
Het samenvoegen van de twee gegevenssets vond plaats aan de SQL Server-zijde, nadat beide gegevenssets zijn opgehaald door PolyBase.
Verplaatsing van aggregatie (weergave met DMV)
Houd rekening met de volgende query, die gebruikmaakt van een statistische functie:
SELECT SUM([Quantity]) as Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];
Met Pushdown van aggregatie (weergave met DMV)
Als er een pushdown van de aggregatie plaatsvindt, ziet u de aggregatiefunctie in de read_command
. Bijvoorbeeld:
SELECT [T1_1].[col] AS [col] FROM (SELECT SUM([T2_1].[Quantity]) AS [col]
FROM [AdventureWorks2022].[Production].[ProductInventory] AS T2_1) AS T1_1
De aggregatiefunctie bevindt zich in de opdracht die naar de externe gegevensbron wordt verzonden, zodat de aggregatie omlaag wordt gepusht. De aggregatie is opgetreden bij de externe gegevensbron en alleen de geaggregeerde gegevensset is opgehaald door PolyBase.
Zonder pushdown van aggregatie (weergave met DMV)
Als de pushdown van de aggregatie niet plaatsvindt, ziet u niet de aggregatiefunctie in de read_command
. Bijvoorbeeld:
SELECT "Quantity" FROM "AdventureWorks2022"."Production"."ProductInventory"
De aggregatie is uitgevoerd in SQL Server nadat de niet-samengevoegde gegevensset is opgehaald door PolyBase.