다음을 통해 공유


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

이 문서에서는 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)의 예상 실행 계획:

SSMS의 예상 실행 계획의 스크린샷

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

Azure Data Studio의 예상 실행 계획의 스크린샷

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

DBCC TRACEON (6408, -1);  

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

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

  • 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의 원격 쿼리 연산자에 해당합니다. 예를 들어:

SSMS에서 필터 조건 푸시다운이 있는 실행 계획의 스크린샷입니다.

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

실행 계획의 스크린샷 (Azure Data Studio에서 필터 조건자 푸시다운 포함)

필터 조건자의 푸시다운 없이 실행 계획과 함께 보기

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

SSMS의 예상 실행 계획:

필터 조건 푸시다운 없이 실행된 계획의 스크린샷 (SSMS에서)

Azure Data Studio의 예상 실행 계획:

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의 예상 실행 계획:

SSMS의 조인 푸시다운이 있는 실행 계획의 스크린샷

Azure Data Studio의 예상 실행 계획:

Azure Data Studio의 조인 푸시다운이 포함된 실행 계획의 스크린샷

조인 연산의 푸시다운 없이(실행 계획으로 보기)

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

SSMS의 예상 실행 계획:

SSMS의 조인 푸시다운이 없는 실행 계획의 스크린샷

Azure Data Studio의 예상 실행 계획:

Azure Data Studio의 조인 푸시다운이 없는 실행 계획의 스크린샷

집계의 푸시다운(실행 계획이 포함된 보기)

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

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

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

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

SSMS의 예상 실행 계획:

SSMS의 집계 푸시다운이 있는 실행 계획의 스크린샷입니다.

Azure Data Studio의 예상 실행 계획:

Azure Data Studio의 집계 푸시다운이 있는 실행 계획의 스크린샷

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

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

SSMS의 예상 실행 계획:

SSMS에서 집계 푸시다운이 없는 실행 계획의 스크린샷

Azure Data Studio의 예상 실행 계획:

Azure Data Studio에서 집계 푸시다운이 없는 실행 계획의 스크린샷

DMV 사용

SQL Server 2019(15.x) 이상 버전에서는 sys.dm_exec_external_work DMV의 read_command 열에 외부 데이터 원본으로 전송되는 쿼리가 표시됩니다. 이렇게 하면 푸시다운이 발생하는지 확인할 수 있지만 실행 계획은 노출하지 않습니다. 원격 쿼리를 보려면 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 필드가 4,000자로 제한된다는 것입니다. 쿼리가 충분히 길면 read_commandread_command에서 WHERE/JOIN/집계 함수가 표시되기 전에 잘려질 수 있습니다.

필터 조건 푸시다운(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에서 수행되었습니다.

다음 단계