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
문에서 지정할 수 있습니다.
구문
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