외부 푸시다운이 발생했는지 여부를 확인하는 방법

이 문서에서는 PolyBase 쿼리가 외부 데이터 원본에 대한 푸시다운의 이점을 활용하는지 확인하는 방법을 자세히 설명합니다. 외부 푸시다운에 관한 자세한 내용은 PolyBase의 푸시다운 계산을 참조하세요.

내 쿼리가 외부 푸시다운의 이점을 활용하고 있나요?

푸시다운 계산은 외부 데이터 원본에 대한 쿼리의 성능을 향상시킵니다. 특정 계산 작업은 SQL Server로 가져오는 대신 외부 데이터 원본에 위임됩니다. 특히 필터링 및 조인 푸시다운의 경우 SQL Server 인스턴스의 워크로드를 크게 줄일 수 있습니다.

PolyBase 푸시다운 계산은 쿼리의 성능을 크게 향상시킬 수 있습니다. PolyBase 쿼리가 느리게 수행되는 경우 PolyBase 쿼리의 푸시다운이 발생하는지 확인해야 합니다.

실행 계획에서 푸시다운을 관찰할 수 있는 세 가지 시나리오가 있습니다.

  • 필터링 조건자 푸시다운
  • 조인 푸시다운
  • 집계 푸시다운

참고 항목

PolyBase 푸시다운 계산을 사용하여 외부 데이터 원본으로 푸시다운할 수 있는 항목에 대한 제한 사항이 있습니다.

  • 일부 T-SQL 함수는 푸시다운을 방지할 수 있습니다. 자세한 내용은 PolyBase 기능 및 제한 사항을 참조 하세요.
  • 푸시다운할 수 있는 T-SQL 함수 목록은 PolyBase의 푸시다운 계산을 참조하세요.

관리자가 PolyBase 쿼리를 외부 데이터 원본으로 푸시하는지 확인할 수 있도록 SQL Server 2019(15.x)의 두 가지 새로운 기능이 도입되었습니다.

이 문서에서는 세 가지 푸시다운 시나리오 각각에 대해 이러한 두 사용 사례를 각각 사용하는 방법에 대해 자세히 설명합니다.

TF6408 사용

기본적으로 예상 실행 계획은 원격 쿼리 계획을 노출하지 않으며 원격 쿼리 연산자 개체만 표시됩니다. 예를 들어 SSMS(SQL Server Management Studio)의 예상 실행 계획:

A screenshot of an estimated execution plan in SSMS.

또는 Azure Data Studio에서 다음을 수행합니다.

A screenshot of an estimated execution plan from Azure Data Studio.

SQL Server 2019(15.x)부터 DBCC TRACEON을 사용하여 전역적으로 새 추적 플래그 6408을 사용하도록 설정할 수 있습니다. 예:

DBCC TRACEON (6408, -1);  

이 추적 플래그는 예상 실행 계획에서만 작동하며 실제 실행 계획에는 영향을 주지 않습니다. 이 추적 플래그는 원격 쿼리 단계 중에 발생하는 작업을 보여 주는 원격 쿼리 연산자에 대한 정보를 노출합니다.

실행 계획은 화살표 방향으로 표시된 대로 오른쪽에서 왼쪽으로 읽습니다. 연산자가 다른 연산자의 오른쪽에 있는 경우 "이전"이라고 합니다. 연산자가 다른 연산자의 왼쪽에 있는 경우 "after"라고 합니다.

  • SSMS에서 쿼리를 강조 표시하고 도구 모음에서 예상 실행 계획 표시를 선택하거나 Ctrl+L을 사용합니다.
  • Azure Data Studio에서 쿼리를 강조 표시하고 설명을 선택합니다. 그런 다음, 다음 시나리오를 고려하여 푸시다운이 발생했는지 여부를 확인합니다.

아래의 각 예제에는 SSMS 및 Azure Data Studio의 출력이 포함됩니다.

필터 조건자 푸시다운(실행 계획이 있는 뷰)

WHERE 절에서 필터 조건자를 사용하는 다음 쿼리를 고려합니다.

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

필터 조건자의 푸시다운이 발생하는 경우 필터 연산자는 외부 연산자 앞에 있습니다. 필터 연산자가 외부 연산자 앞에 있으면 필터 조건자가 푸시다운되었음을 나타내는 외부 데이터 원본에서 다시 선택되기 전에 필터링이 발생했습니다.

필터 조건자의 푸시다운 사용(실행 계획을 사용하여 보기)

추적 플래그 6408을 사용하도록 설정하면 이제 예상 실행 계획 출력에 추가 정보가 표시됩니다. 출력은 SSMS와 Azure Data Studio 간에 달라집니다.

SSMS에서 원격 쿼리 계획은 예상 실행 계획에 쿼리 2(sp_execute_memo_node_1)로 표시되고 쿼리 1의 원격 쿼리 연산자에 해당합니다. 예:

A screenshot of an execution plan with filter predicate pushdown from SSMS.

Azure Data Studio에서 원격 쿼리 실행은 대신 단일 쿼리 계획으로 표시됩니다. 예:

A screenshot of an execution plan with filter predicate pushdown from Azure Data Studio.

필터 조건자의 푸시다운 없이(실행 계획을 사용하여 보기)

필터 조건자의 푸시다운이 발생하지 않는 경우 필터는 외부 연산자 뒤가 됩니다.

SSMS의 예상 실행 계획:

A screenshot of an execution plan without filter predicate pushdown from SSMS.

Azure Data Studio의 예상 실행 계획:

A screenshot of an execution plan without filter predicate pushdown from Azure Data Studio.

JOIN 푸시다운

동일한 외부 데이터 원본에 있는 두 개의 외부 테이블에 JOIN 연산자를 활용하는 다음 쿼리를 고려합니다.

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

JOIN을 외부 데이터 원본으로 푸시하는 경우 Join 연산자는 외부 연산자 앞에 있습니다. 이 예제에서는 둘 다 [BusinessEntity] 외부 테이블입니다 [BusinessEntityAddress] .

조인 푸시다운 사용(실행 계획이 있는 보기)

SSMS의 예상 실행 계획:

A screenshot of an execution plan with join pushdown from SSMS.

Azure Data Studio의 예상 실행 계획:

A screenshot of an execution plan with join pushdown from Azure Data Studio.

조인 푸시다운 없이(실행 계획을 사용하여 보기)

JOIN이 외부 데이터 원본으로 푸시다운되지 않으면 Join 연산자는 외부 연산자 뒤가 됩니다. SSMS에서 외부 연산자는 쿼리 1의 원격 쿼리 연산자에 있는 쿼리 계획에 sp_execute_memo_node있습니다. Azure Data Studio에서 조인 연산자는 외부 연산자 뒤에 있습니다.

SSMS의 예상 실행 계획:

A screenshot of an execution plan without join pushdown from SSMS.

Azure Data Studio의 예상 실행 계획:

A screenshot of an execution plan without join pushdown from Azure Data Studio.

집계 푸시다운(실행 계획이 있는 뷰)

집계 함수를 사용하는 다음 쿼리를 고려합니다.

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

집계 푸시다운(실행 계획을 사용하여 보기)

집계 푸시다운이 발생하는 경우 집계 연산자는 외부 연산자 앞에 있습니다. 집계 연산자가 외부 연산자 앞에 있으면 집계가 외부 데이터 원본에서 다시 선택되기 전에 집계가 발생했으며 이는 집계가 푸시다운되었음을 나타냅니다.

SSMS의 예상 실행 계획:

A screenshot of an execution plan with aggregate pushdown from SSMS.

Azure Data Studio의 예상 실행 계획:

A screenshot of an execution plan with aggregate pushdown from Azure Data Studio.

집계 푸시다운 없이(실행 계획을 사용하여 보기)

집계 푸시다운이 발생하지 않는 경우 집계 연산자는 외부 연산자 뒤에 있습니다.

SSMS의 예상 실행 계획:

A screenshot of an execution plan without aggregate pushdown from SSMS.

Azure Data Studio의 예상 실행 계획:

A screenshot of an execution plan without aggregate pushdown from Azure Data Studio.

DMV 사용

SQL Server 2019(15.x) 이상 버전 read_command 에서는 sys.dm_exec_external_work DMV 열에 외부 데이터 원본으로 전송되는 쿼리가 표시됩니다. 이렇게 하면 푸시다운이 발생하는지 확인할 수 있지만 실행 계획은 노출하지 않습니다. 원격 쿼리를 보려면 TF6408이 필요하지 않습니다.

참고 항목

Hadoop 및 Azure Storage의 경우 read_command는 항상 NULL을 반환합니다.

다음 쿼리를 실행하고 조사 중인 쿼리를 start_time/end_timeread_command 사용하여 식별할 수 있습니다.

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

참고 항목

sys.dm_exec_external_work 메서드의 한 가지 제한 사항은 DMV의 read_command 필드가 4000자로 제한된다는 것입니다. 쿼리가 충분히 길 read_command 면 WHERE/JOIN/집계 함수 read_command가 표시되기 전에 잘려질 수 있습니다.

필터 조건자 푸시다운(DMV가 있는 뷰)

이전 필터 조건자 예제에서 사용된 쿼리를 고려합니다.

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

필터 푸시다운 사용(DMV를 사용하여 보기)

DMV에서 확인하여 read_command 필터 조건자의 푸시다운이 발생하는지 확인할 수 있습니다. 다음 샘플과 같이 표시됩니다.

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;

WHERE 절은 외부 데이터 원본으로 전송되는 명령에 있습니다. 즉, 필터 조건자가 외부 데이터 원본에서 평가되고 있음을 의미합니다. 데이터 세트의 필터링이 외부 데이터 원본에서 발생했으며 필터링된 데이터 세트만 PolyBase에서 검색되었습니다.

필터 푸시다운 없이(DMV를 사용하여 보기)

푸시다운이 발생하지 않으면 다음과 같이 표시됩니다.

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

외부 데이터 원본으로 전송되는 명령에 WHERE 절이 없으므로 필터 조건자가 푸시다운되지 않습니다. 전체 데이터 세트에 대한 필터링은 PolyBase에서 데이터 세트를 검색한 후 SQL Server 쪽에서 발생했습니다.

JOIN 푸시다운(DMV를 사용하여 보기)

이전 JOIN 예제에서 사용된 쿼리를 고려합니다.

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

조인 푸시다운 포함(DMV가 있는 뷰)

JOIN이 외부 데이터 원본에 푸시다운되는 경우 다음과 같이 표시됩니다.

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;

JOIN 절은 외부 데이터 원본으로 전송되는 명령에 있으므로 JOIN은 푸시다운됩니다. 데이터 세트의 조인은 외부 데이터 원본에서 발생했으며 조인 조건과 일치하는 데이터 세트만 PolyBase에서 검색되었습니다.

조인 푸시다운 없이(DMV를 사용하여 보기)

조인 푸시다운이 발생하지 않으면 외부 데이터 원본에 대해 실행된 두 가지 쿼리가 있습니다.

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에서 두 데이터 세트를 검색한 후 SQL Server 쪽에서 발생했습니다.

집계 푸시다운(DMV를 사용하여 보기)

집계 함수를 사용하는 다음 쿼리를 고려합니다.

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

집계 푸시다운 사용(DMV를 사용하여 보기)

집계의 푸시다운이 발생하는 경우 집계 함수 read_command가 표시됩니다. 예:

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

집계 함수는 외부 데이터 원본으로 전송되는 명령에 있으므로 집계가 푸시다운됩니다. 집계는 외부 데이터 원본에서 발생했으며 PolyBase에서 집계된 데이터 세트만 검색되었습니다.

집계 푸시다운 제외(DMV가 있는 뷰)

집계 푸시다운이 발생하지 않으면 집계 함수 read_command가 표시되지 않습니다. 예:

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

집계는 PolyBase에서 집계되지 않은 데이터 세트를 검색한 후 SQL Server에서 수행되었습니다.

다음 단계