SQL Server용 PolyBase의 성능 고려 사항

적용 대상: SQL Server 2016(13.x) - Windows 이상 버전SQL Server 2017(14.x) - Linux 이상 버전 Azure Synapse Analytics

SQL Server용 PolyBase에서는 쿼리할 수 있는 파일 수 또는 데이터 양에 대한 하드 제한이 없습니다. 쿼리 성능은 데이터 양, 데이터 형식, 데이터 구성 방식, 쿼리 및 조인의 복잡성에 따라 달라집니다.

이 문서에서는 중요한 성능 항목 및 지침을 다룹니다.

통계

쿼리 최적화를 위해 할 수 있는 가장 중요한 작업은 외부 데이터에 대한 통계를 수집하는 것입니다. 인스턴스에서 데이터에 대해 많이 알수록 쿼리를 빠르게 실행할 수 있습니다. SQL 엔진 쿼리 최적화 프로그램은 비용을 기반으로 하는 최적화 프로그램입니다. 다양한 쿼리 계획의 비용을 비교한 다음, 비용이 가장 낮은 계획을 선택합니다. 대부분의 경우 가장 빠르게 실행되는 계획을 선택합니다.

통계 자동 생성

SQL Server 2022부터 데이터베이스 엔진 들어오는 사용자 쿼리에서 누락된 통계를 분석합니다. 누락된 통계가 있는 경우 쿼리 최적화 프로그램이 쿼리 조건자 또는 조인 조건의 개별 열에 대한 통계를 자동으로 만들어서 쿼리 계획의 카디널리티 추정값을 개선합니다. 통계 자동 생성은 동기적으로 수행되므로 열에 통계가 누락된 경우 쿼리 성능이 약간 저하될 수 있습니다. 단일 열에 대한 통계를 만드는 데 걸리는 시간은 대상으로 지정된 파일의 크기에 따라 달라집니다.

OPENROWSET 수동 통계 만들기

단일 열을 매개 변수로 사용하여 선택 쿼리를 전달하여 저장 프로시저를 사용하여 sys.sp_create_openrowset_statistics OPENROWSET 경로에 대한 단일 열 통계를 만들 수 있습니다.

EXEC sys.sp_create_openrowset_statistics N' 
SELECT pickup_datetime 
FROM OPENROWSET( 
 BULK ''abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/*.parquet'', 
 FORMAT = ''parquet'') AS filerows';

기본적으로 인스턴스는 데이터 세트에 제공된 데이터의 100%를 사용하여 통계를 만듭니다. 필요에 따라 TABLESAMPLE 옵션을 사용하여 샘플 크기를 백분율로 지정할 수 있습니다. 여러 열에 대한 단일 열 통계를 만들려면 각 열에 대해 실행 sys.sp_create_openrowset_statistics 합니다. OPENROWSET 경로에 대한 다중 열 통계는 만들 수 없습니다.

기존 통계를 업데이트하려면 sys.sp_drop_openrowset_statistics 저장 프로시저를 사용하여 먼저 삭제한 다음, sys.sp_create_openrowset_statistics를 사용하여 다시 만듭니다.

EXEC sys.sp_drop_openrowset_statistics 
N'SELECT pickup_datetime 
FROM OPENROWSET( 
 BULK ''abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/*.parquet'', 
 FORMAT = ''parquet'') AS filerows 
';

외부 테이블 수동 통계 만들기

외부 테이블에 대한 통계를 만드는 구문은 일반 사용자 테이블에 사용되는 구문과 유사합니다. 열에 대해 통계를 만들려면 통계 개체의 이름과 열 이름을 제공합니다.

CREATE STATISTICS sVendor 
ON tbl_TaxiRides (vendorID) 
WITH FULLSCAN, NORECOMPUTE; 

WITH 옵션은 필수이며 샘플 크기의 경우 허용되는 옵션은 다음과 같습니다 FULLSCANSAMPLE n PERCENT.

  • 여러 열에 대한 단일 열 통계를 만들려면 각 열에 대해 실행 CREATE STATISTICS 합니다.
  • 여러 열 통계는 지원되지 않습니다.

분할된 데이터 쿼리

데이터는 파티션이라고도 하는 하위 폴더로 구성되는 경우가 많습니다. SQL Server 인스턴스에 특정 폴더 및 파일만 쿼리하도록 지시할 수 있습니다. 이렇게 하면 쿼리에서 읽고 처리하는 데 필요한 파일 수와 데이터 양이 줄어들어 성능이 향상됩니다. 이러한 유형의 쿼리 최적화를 파티션 정리 또는 파티션 제거라고 합니다. 쿼리 절에서 메타데이터 함수 filepath() 를 사용하여 쿼리 실행에서 파티션을 WHERE 제거할 수 있습니다.

먼저 외부 데이터 원본을 만듭니다.

CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net'
);
GO

다음 샘플 쿼리에서는 2017년 마지막 3개월 동안의 NYC Yellow Taxi 데이터 파일을 읽습니다.

SELECT 
    r.filepath() AS filepath 
    ,r.filepath(1) AS [year] 
    ,r.filepath(2) AS [month] 
    ,COUNT_BIG(*) AS [rows] 
FROM OPENROWSET( 
        BULK 'yellow/puYear=*/puMonth=*/*.parquet', 
        DATA_SOURCE = 'NYCTaxiExternalDataSource', 
        FORMAT = 'parquet' 
    ) 
WITH ( 
    vendorID INT 
) AS [r] 
WHERE 
    r.filepath(1) IN ('2017') 
    AND r.filepath(2) IN ('10', '11', '12') 
GROUP BY 
    r.filepath() 
    ,r.filepath(1) 
    ,r.filepath(2) 
ORDER BY filepath;

저장된 데이터가 분할되지 않은 경우 쿼리 성능을 향상시키기 위해 분할하는 것이 좋습니다.

외부 테이블을 filepath()filename() 사용하는 경우 함수는 지원되지만 절에서는 WHERE 지원되지 않습니다. 계산 열에서 filename 필터링하거나 filepath 사용하는 경우 계속 필터링할 수 있습니다. 다음은 이에 대한 예입니다.

CREATE EXTERNAL TABLE tbl_TaxiRides ( 
 vendorID VARCHAR(100) COLLATE Latin1_General_BIN2, 
 tpepPickupDateTime DATETIME2, 
 tpepDropoffDateTime DATETIME2, 
 passengerCount INT, 
 tripDistance FLOAT, 
 puLocationId VARCHAR(8000), 
 doLocationId VARCHAR(8000), 
 startLon FLOAT, 
 startLat FLOAT, 
 endLon FLOAT, 
 endLat FLOAT, 
 rateCodeId SMALLINT, 
 storeAndFwdFlag VARCHAR(8000), 
 paymentType VARCHAR(8000), 
 fareAmount FLOAT, 
 extra FLOAT, 
 mtaTax FLOAT, 
 improvementSurcharge VARCHAR(8000), 
 tipAmount FLOAT, 
 tollsAmount FLOAT, 
 totalAmount FLOAT, 
 [Year]  AS CAST(filepath(1) AS INT), --use filepath() for partitioning 
 [Month]  AS CAST(filepath(2) AS INT) --use filepath() for partitioning 
) 
WITH ( 
 LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet', 
 DATA_SOURCE = NYCTaxiExternalDataSource, 
 FILE_FORMAT = DemoFileFormat 
); 
GO 
 
SELECT * 
      FROM tbl_TaxiRides 
WHERE 
      [year]=2017             
      AND [month] in (10,11,12); 

저장된 데이터가 분할되지 않은 경우 쿼리 성능을 향상시키기 위해 분할하는 것이 좋습니다.

Hadoop에 계산 푸시

SQL Server 2016(13.x), SQL Server 2017(14.x) 및 SQL Server 2019(15.x)에만 적용됩니다.

PolyBase는 일부 계산을 외부 원본에 푸시하여 전체 쿼리를 최적화합니다. 쿼리 최적화 프로그램은 쿼리 성능을 향상시키는 경우 Hadoop에 계산을 푸시하는 비용 기반 결정을 내립니다. 쿼리 최적화 프로그램은 외부 테이블의 통계를 사용하여 비용 기반 결정을 내립니다. 계산을 푸시하면 MapReduce 작업이 생성되고 Hadoop의 분산 계산 리소스를 활용합니다. 자세한 내용은 PolyBase의 푸시다운 계산을 참조하세요.

컴퓨팅 리소스 스케일링

SQL Server 2016(13.x), SQL Server 2017(14.x) 및 SQL Server 2019(15.x)에만 적용됩니다.

쿼리 성능을 향상시키기 위해 SQL Server PolyBase 스케일 아웃 그룹을 사용할 수 있습니다. 이렇게 하면 SQL Server 인스턴스와 Hadoop 노드 간에 병렬 데이터 전송이 가능하며 외부 데이터에서 작동하기 위한 컴퓨팅 리소스가 추가됩니다.

Important

Microsoft SQL Server PolyBase 스케일 아웃 그룹은 사용 중지됩니다. 스케일 아웃 그룹 기능은 SQL Server 2022(16.x) 제품에서 제거됩니다. PolyBase 데이터 가상화는 SQL Server 스케일 업 기능으로 계속 완벽하게 지원됩니다. 자세한 내용은 Microsoft SQL Server 플랫폼의 빅 데이터 옵션을 참조하세요.