다음을 통해 공유


PolyBase의 푸시다운 계산

적용 대상: SQL Server 2016(13.x) 이상 버전

푸시다운 계산은 외부 데이터 원본에 대한 쿼리의 성능을 향상합니다. SQL Server 2016(13.x)부터 Hadoop 외부 데이터 원본에 푸시다운 계산을 사용할 수 있었습니다. SQL Server 2019(15.x)에는 다른 유형의 외부 데이터 원본에 대한 푸시다운 계산이 도입되었습니다.

참고 항목

PolyBase 푸시다운 계산이 쿼리에 도움이 되는지 확인하려면 외부 푸시다운이 발생했는지를 확인하는 방법을 참조하세요.

푸시다운 계산 사용

다음 문서에는 특정 유형의 외부 데이터 원본에 대한 푸시다운 계산을 구성하는 방법에 대한 정보가 포함되어 있습니다.

다음 표에는 여러 외부 데이터 원본에 대한 푸시다운 계산 지원 내용이 요약되어 있습니다.

데이터 원본 조인 프로젝션 집계 필터 통계
일반 ODBC
Oracle 예+
SQL Server
Teradata
MongoDB* 아니요 예*** 예***
Hadoop 문제 일부** 일부**
Azure Blob Storage 아니요 아니요 아니요 아니요

* Azure Cosmos DB 푸시다운 지원은 MongoDB용 Azure Cosmos DB API를 통해 사용하도록 설정됩니다.

** 푸시다운 계산 및 Hadoop 공급자를 참조하세요.

*** SQL Server 2019용 MongoDB ODBC 커넥터에 대한 집계 및 필터에 대한 푸시다운 지원은 SQL Server 2019 CU18에서 도입되었습니다.

+ Oracle은 조인에 대한 푸시다운을 지원하지만 푸시다운을 달성하려면 조인 열에 대한 통계를 만들어야 할 수 있습니다.

참고 항목

푸시다운 계산은 일부 T-SQL 구문으로 차단될 수 있습니다. 자세한 내용은 푸시다운을 방지하는 구문을 참조하세요.

푸시다운 계산 및 Hadoop 공급자

PolyBase는 현재 두 개의 Hadoop 공급자 Hortonworks Data Platform(HDP) 및 Cloudera Distributed Hadoop(CDH)을 지원합니다. 푸시다운 계산의 측면에서 두 기능 간에는 차이가 없습니다.

Hadoop에서 계산 푸시다운 기능을 사용하려면 대상 Hadoop 클러스터에 작업 기록 서버를 사용하도록 설정된 HDFS, YARN 및 MapReduce의 핵심 구성 요소가 있어야 합니다. PolyBase는 MapReduce를 통해 푸시다운 쿼리를 제출하고 작업 기록 서버에서 상태 가져옵니다. 두 구성 요소 중 하나가 없으면 쿼리가 실패합니다.

일부 집계는 데이터가 SQL Server에 도달한 후에 이루어져야 합니다. 하지만 집계의 일부는 Hadoop에서 발생합니다. 이 방법은 대규모 병렬 처리 시스템에서 집계를 계산하는 데 사용됩니다.

Hadoop 공급자는 다음과 같은 집계 및 필터를 지원합니다.

집계 필터(이진 비교)
Count_Big NotEqual
Sum LessThan
Avg LessOrEqual
Max GreaterOrEqual
Min GreaterThan
Approx_Count_Distinct Is
IsNot

푸시다운 계산의 주요 이점 시나리오

PolyBase 푸시다운 계산을 사용하면 계산 작업을 외부 데이터 원본에 위임할 수 있습니다. 이를 통해 SQL Server 인스턴스의 워크로드가 줄어들고 성능이 대폭 향상될 수 있습니다.

SQL Server는 조인, 프로젝션, 집계 및 필터를 외부 데이터 원본으로 푸시하여 원격 컴퓨팅을 활용하고 네트워크를 통해 전송되는 데이터를 제한할 수 있습니다.

조인 푸시다운

대부분의 경우 PolyBase는 동일한 외부 데이터 원본에 있는 두 외부 테이블의 조인에 대한 조인 연산자의 푸시다운을 용이하게 할 수 있으므로 성능이 대폭 향상됩니다.

외부 데이터 원본에서 조인을 수행할 수 있으면 데이터 이동의 양이 줄어들고 쿼리 성능이 향상됩니다. 조인 푸시다운을 사용하지 않으면 조인할 테이블의 데이터를 로컬로 tempdb로 가져온 다음 조인해야 합니다.

배포 조인(로컬 테이블을 외부 테이블에 조인)의 경우 조인된 외부 테이블에 필터가 없으면 조인 작업을 수행하기 위해 외부 테이블의 모든 데이터를 tempdb에 로컬로 가져와야 합니다. 예를 들어, 다음 쿼리에는 외부 테이블 조인 조건에 대한 필터링이 없으므로 외부 테이블의 모든 데이터를 읽을 수 있습니다.

SELECT * FROM LocalTable L
JOIN ExternalTable E on L.id = E.id

조인이 외부 테이블의 E.id 열에 있으므로 해당 열에 필터 조건을 추가하면 필터가 아래로 밀려서 외부 테이블에서 읽는 행 수를 줄일 수 있습니다.

SELECT * FROM LocalTable L
JOIN ExternalTable E on L.id = E.id
WHERE E.id = 20000

행의 하위 집합 선택

조건자 푸시다운을 사용하여 외부 테이블에서 행의 하위 집합을 선택하는 쿼리의 성능을 개선합니다.

이 예시에서는 SQL Server가 맵 축소 작업을 추진하여 Hadoop에서 조건자 customer.account_balance < 200000과 일치하는 행을 검색합니다. 테이블의 모든 행을 검색하지 않고 쿼리가 성공적으로 완료될 수 있으므로 조건자 조건에 맞는 행만 SQL Server에 복사됩니다. 이렇게 하면 계정 잔액 <= 200,000인 고객 수에 비해 고객 잔액 > 200,000이 적은 경우 상당한 시간을 절약하고 임시 스토리지 공간이 덜 필요합니다.

SELECT * FROM customer WHERE customer.account_balance < 200000;
SELECT * FROM SensorData WHERE Speed > 65;  

열의 하위 집합을 선택합니다.

조건자 푸시다운을 사용하여 외부 테이블에서 열의 하위 집합을 선택하는 쿼리의 성능을 개선합니다.

이 쿼리에서 SQL Server는 맵 축소 작업을 추진하여 Hadoop 구분 텍스트 파일을 전처리하여 customer.name 및 customer.zip_code 두 열의 데이터만 SQL Server로 복사합니다.

SELECT customer.name, customer.zip_code
FROM customer
WHERE customer.account_balance < 200000;

기본 식 및 연산자 푸시다운

SQL Server는 조건자 푸시다운에 대해 다음과 같은 기본 식과 연산자를 허용합니다.

  • 숫자, 날짜 및 시간 값에 대한 이진 비교 연산자(<, >, =, !=, <>, >=, <=)
  • 산술 연산자(+, -, *, /, %).
  • 논리 연산자(AND, OR).
  • 단항 연산자(NOT, IS NULL, IS NOT NULL)

연산자 BETWEEN, NOT, INLIKE는 푸시다운될 수 있습니다. 실제 동작은 쿼리 최적화 도구가 연산자 식을 기본 관계형 연산자를 사용하는 일련의 문으로 재작성하는 방식에 따라 달라집니다.

이 예시의 쿼리에는 Hadoop으로 푸시할 수 있는 여러 조건자가 있습니다. SQL Server는 맵 감소 작업을 Hadoop에 푸시하여 customer.account_balance <= 200000 조건자를 수행할 수 있습니다. BETWEEN 92656 AND 92677 식은 Hadoop에 푸시할 수 있는 이진 및 논리 연산으로도 구성됩니다. customer.account_balance AND customer.zipcode의 논리적 AND는 최종 식입니다.

이러한 조건자의 조합을 고려할 때 map-reduce 작업은 모든 WHERE 절을 수행할 수 있습니다. SELECT 기준을 충족하는 데이터만 SQL Server로 다시 복사됩니다.

SELECT * FROM customer 
WHERE customer.account_balance <= 200000 
AND customer.zipcode BETWEEN 92656 AND 92677;

푸시다운에 지원되는 함수

SQL Server는 조건자 푸시다운에 대해 다음 함수를 허용합니다.

문자열 함수

  • CONCAT
  • DATALENGTH
  • LEN
  • LIKE
  • LOWER
  • LTRIM
  • RTRIM
  • SUBSTRING
  • UPPER

수학 함수

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • CEILING
  • COS
  • EXP
  • FLOOR
  • POWER
  • SIGN
  • SIN
  • SQRT
  • TAN

일반 함수

  • COALESCE *
  • NULLIF

* COLLATE를 함께 사용하면 일부 시나리오에서 푸시다운을 방지할 수 있습니다. 자세한 내용은 데이터 정렬 충돌을 참조하세요.

날짜/시간 함수

  • DATEADD
  • DATEDIFF
  • DATEPART

푸시다운을 방지하는 구문

다음 T-SQL 함수 또는 구문은 푸시다운 계산을 방지합니다.

  • AT TIME ZONE
  • CONCAT_WS
  • TRANSLATE
  • RAND
  • CHECKSUM
  • BINARY_CHECKSUM
  • HASHBYTES
  • ISJSON
  • JSON_VALUE
  • JSON_QUERY
  • JSON_MODIFY
  • NEWID
  • STRING_ESCAPE
  • COMPRESS
  • DECOMPRESS
  • GREATEST
  • LEAST
  • PARSE

FORMAT 구문 및 TRIM 구문에 대한 푸시다운 지원은 SQL Server 2019(15.x) CU10에서 도입되었습니다.

변수가 있는 필터 절

필터 절에 변수를 지정할 때 기본적으로 필터 절의 푸시다운을 방지합니다. 예를 들어 다음 쿼리를 실행하면 필터 절이 푸시다운되지 않습니다.

DECLARE @BusinessEntityID INT

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

변수의 푸시다운을 달성하려면 쿼리 최적화 프로그램 핫픽스 기능을 사용하도록 설정해야 합니다. 이 작업은 다음 방법 중 하나로 수행할 수 있습니다.

  • 인스턴스 수준: 인스턴스에 대한 시작 매개 변수로 추적 플래그 4199 사용
  • 데이터베이스 수준: PolyBase 외부 개체가 있는 데이터베이스의 컨텍스트에서 ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON을 실행합니다.
  • 쿼리 수준: 쿼리 힌트 OPTION (QUERYTRACEON 4199) 또는 OPTION (USE HINT ('ENABLE_QUERY_OPTIMIZER_HOTFIXES')) 사용

이 제한은 sp_executesql 실행에 적용됩니다. 필터 절에 있는 일부 함수의 사용에도 제한이 적용됩니다.

변수를 푸시다운하는 기능은 SQL Server 2019 CU5에서 처음 도입되었습니다.

데이터 정렬 충돌

데이터 정렬이 다른 데이터로는 푸시다운이 불가능할 수 있습니다. COLLATE 등의 연산자는 결과를 방해할 수도 있습니다. 같음 데이터 정렬 또는 이진 데이터 정렬이 지원됩니다. 자세한 내용은 푸시다운이 발생했는지를 확인하는 방법을 참조하세요.

parquet 파일에 대한 푸시다운

SQL Server 2022(16.x)부터 PolyBase는 parquet 파일에 대한 지원을 도입했습니다. SQL Server는 parquet을 사용하여 푸시다운을 수행할 때 행과 열 제거를 모두 수행할 수 있습니다. parquet 파일을 사용하면 다음 작업을 푸시다운할 수 있습니다.

  • 숫자, 날짜 및 시간 값에 대한 이진 비교 연산자(>, >=, <=, <)
  • 비교 연산자(> AND <, >= AND <, > AND <=, <= AND >=)의 조합.
  • 목록 필터에서 (col1 = val1 OR col1 = val2 OR vol1 = val3).
  • 열에 대해 NULL이 아닙니다.

다음이 있으면 parquet 파일에 대한 푸시다운을 방지할 수 있습니다.

  • 가상 열.
  • 열 비교.
  • 매개 변수 형식 변환.

지원되는 데이터 유형

  • bit
  • TinyInt
  • SmallInt
  • BigInt
  • 실수
  • Float
  • VARCHAR(Bin2Collation, CodePageConversion, BinCollation)
  • NVARCHAR(Bin2Collation, BinCollation)
  • 이진
  • DateTime2(기본 및 7자리 전체 자릿수)
  • 날짜
  • Time(기본값 및 7자리 전체 자릿수)
  • *(숫자 키패드)

* 매개 변수 눈금이 열 눈금과 일치하거나 매개 변수가 명시적으로 10진수로 캐스팅되는 경우에 지원됩니다.

parquet 푸시다운을 방지하는 데이터 형식

  • Money
  • SmallMoney
  • DateTime
  • SmallDateTime

예시

강제 푸시다운

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (FORCE EXTERNALPUSHDOWN);

푸시다운 사용 안 함

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (DISABLE EXTERNALPUSHDOWN);