다음을 통해 공유


OPTION 절(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

지정한 쿼리 힌트가 전체 쿼리에서 사용되도록 지정합니다. 여러 개의 쿼리 힌트가 허용되지만 각 쿼리 힌트는 한 번만 지정할 수 있습니다. 문에서 하나의 OPTION 절만 지정할 수 있습니다.

이 절은 SELECT, DELETE, UPDATE, MERGE 문에서 지정할 수 있습니다.

Transact-SQL 구문 표기 규칙

구문

SQL Server, Azure SQL Managed Instance 및 Azure SQL Database에 대한 구문:

[ OPTION ( <query_hint> [ , ...n ] ) ]

Microsoft Fabric의 Warehouse 구문:

OPTION ( <query_option> [ , ...n ] )

<query_option> ::=
    LABEL = label_name |
    <query_hint>

<query_hint> ::=
    HASH JOIN
    | LOOP JOIN
    | MERGE JOIN
    | FORCE ORDER
    | { FORCE | DISABLE } EXTERNALPUSHDOWN
    | FOR TIMESTAMP AS OF '<point_in_time>'

Microsoft Fabric의 Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW) 및 SQL 분석 엔드포인트에 대한 구문:

OPTION ( <query_option> [ , ...n ] )

<query_option> ::=
    LABEL = label_name |
    <query_hint>

<query_hint> ::=
    HASH JOIN
    | LOOP JOIN
    | MERGE JOIN
    | FORCE ORDER
    | { FORCE | DISABLE } EXTERNALPUSHDOWN

Azure Synapse Analytics의 서버리스 SQL 풀 구문:

OPTION ( <query_option> [ , ...n ] )

<query_option> ::=
    LABEL = label_name

인수

query_hint

데이터베이스 엔진에서 최적화 프로그램 힌트를 사용하여 문을 처리하는 방법을 사용자 지정한다는 것을 나타내는 키워드입니다. 자세한 내용은 쿼리 힌트를 참조하세요.

예제

이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용하며, 이는 Microsoft SQL Server 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.

A. GROUP BY 절과 함께 OPTION 절 사용

다음 예에서는 OPTION 절과 함께 GROUP BY 절을 사용하는 방법을 보여 줍니다.

USE AdventureWorks2022;
GO

SELECT ProductID,
    OrderQty,
    SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

B. OPTION 절에서 레이블을 사용하는 SELECT 문

다음 예제에서는 절에 레이블 OPTION 이 있는 Azure Synapse Analytics SELECT 문을 보여 줍니다.

SELECT * FROM FactResellerSales
OPTION (LABEL = 'q17');

C. OPTION 절에서 쿼리 힌트를 사용하는 SELECT 문

다음 예제에서는 절에 SELECT 쿼리 힌트를 HASH JOIN 사용하는 문을 보여 있습니다 OPTION .

-- Uses AdventureWorks

SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
    ON (a.CustomerKey = b.CustomerKey)
OPTION (HASH JOIN);

D. OPTION 절에서 레이블 및 여러 쿼리 힌트를 사용하는 SELECT 문

다음 예제는 레이블 및 여러 쿼리 힌트를 포함하는 Azure Synapse Analytics SELECT 문입니다. 컴퓨팅 노드에서 쿼리를 실행하면 SQL Server에서 가장 최적이라고 결정하는 전략에 따라 SQL Server는 해시 조인 또는 병합 조인을 적용합니다.

SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
    ON (a.CustomerKey = b.CustomerKey)
OPTION (Label = 'CustJoin', HASH JOIN, MERGE JOIN);

E. 뷰를 쿼리할 때 쿼리 힌트 사용

다음 예제에서는 CustomerView라는 뷰를 HASH JOIN 만든 다음 뷰와 테이블을 참조하는 쿼리에서 쿼리 힌트를 사용합니다.

CREATE VIEW CustomerView
AS
SELECT CustomerKey,
    FirstName,
    LastName
FROM ssawPDW..DimCustomer;
GO

SELECT COUNT(*)
FROM dbo.CustomerView a
INNER JOIN dbo.FactInternetSales b
    ON (a.CustomerKey = b.CustomerKey)
OPTION (HASH JOIN);
GO

DROP VIEW CustomerView;
GO

F. 하위 select 및 쿼리 힌트가 있는 쿼리

다음 예제에서는 하위 select 및 쿼리 힌트 모두를 포함하는 쿼리를 보여 줍니다. 쿼리 힌트는 전역적으로 적용됩니다. 쿼리 힌트는 하위 선택 문에 추가할 수 없습니다.

CREATE VIEW CustomerView
AS
SELECT CustomerKey,
    FirstName,
    LastName
FROM ssawPDW..DimCustomer;
GO

SELECT *
FROM (
    SELECT COUNT(*) AS a
    FROM dbo.CustomerView a
    INNER JOIN dbo.FactInternetSales b
        ON (a.CustomerKey = b.CustomerKey)
) AS t
OPTION (HASH JOIN);

G. 쿼리의 순서와 일치하도록 조인 순서 강제 적용

다음 예제에서는 힌트를 FORCE ORDER 사용하여 쿼리 계획에서 쿼리에 지정된 조인 순서를 사용하도록 강제합니다. 이 힌트는 일부 쿼리의 성능을 향상시키지만 일부 쿼리의 성능은 향상되지 않습니다.

이 쿼리는 데이터베이스 테이블의 파티션에 대한 파티션 ProspectiveBuyer 번호, 경계 값, 경계 값 형식 및 경계당 행을 ssawPDW 가져옵니다.

SELECT sp.partition_number,
    prv.value AS boundary_value,
    lower(sty.name) AS boundary_value_type,
    sp.rows
FROM sys.tables st
INNER JOIN sys.indexes si
    ON st.object_id = si.object_id AND si.index_id < 2
INNER JOIN sys.partitions sp
    ON sp.object_id = st.object_id AND sp.index_id = si.index_id
INNER JOIN sys.partition_schemes ps
    ON ps.data_space_id = si.data_space_id
INNER JOIN sys.partition_range_values prv
    ON prv.function_id = ps.function_id
INNER JOIN sys.partition_parameters pp
    ON pp.function_id = ps.function_id
INNER JOIN sys.types sty
    ON sty.user_type_id = pp.user_type_id AND prv.boundary_id = sp.partition_number
WHERE st.object_id = (
    SELECT object_id
    FROM sys.objects
    WHERE name = 'FactResellerSales'
)
ORDER BY sp.partition_number
OPTION (FORCE ORDER);

H. EXTERNALPUSHDOWN 사용

다음 예제에서는 절의 WHERE 푸시다운을 외부 Hadoop 테이블의 MapReduce 작업으로 강제 적용합니다.

SELECT ID FROM External_Table_AS A
WHERE ID < 1000000
OPTION (FORCE EXTERNALPUSHDOWN);

다음 예제에서는 외부 Hadoop 테이블의 MapReduce 작업에 대한 절의 WHERE 푸시다운을 방지합니다. 모든 행은 절이 적용되는 PDW로 WHERE 반환됩니다.

SELECT ID FROM External_Table_AS A
WHERE ID < 10
OPTION (DISABLE EXTERNALPUSHDOWN);

9\. 특정 시점의 데이터 쿼리

적용 대상: Microsoft Fabric 내 Warehouse

자세한 내용은 FOR TIMESTAMP 쿼리 힌트를 참조하세요.

Microsoft Fabric의 Synapse Data Warehouse에서 과거에 존재했던 데이터를 쿼리하려면 OPTION 절에서 TIMESTAMP 구문을 사용합니다. 다음 샘플 쿼리는 2024년 3월 13일 오후 7:39:35.28(UTC)에 표시된 데이터를 반환합니다. 표준 시간대는 항상 UTC입니다.

SELECT OrderDateKey,
    SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC