OPTION 句 (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

クエリ全体で、指定のクエリ ヒントを使用する必要があることを指定します。 複数のクエリ ヒントを使用できますが、各クエリ ヒントを指定できるのは 1 回だけです。 OPTION 句はステートメントで 1 回だけ指定できます。

この句は SELECT、DELETE、UPDATE、MERGE ステートメントで指定できます。

Transact-SQL 構文表記規則

構文

SQL Server と Azure SQL Database の構文

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

Azure Synapse Analytics および Analytics Platform System (PDW) の構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

query_hint
データベース エンジンのステートメント処理をカスタマイズするためのオプティマイザー ヒントを示すキーワードです。 詳細については、「 クエリ ヒント (Transact-SQL)」を参照してください。

A. OPTION 句を GROUP BY 句と共に使用する

次の例では、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、Analytics Platform System (PDW)

B. SELECT ステートメントと OPTION 句のラベル

次の例に、Azure Synapse Analytics SELECT ステートメントと OPTION 句のラベルを示します。

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

C. SELECT ステートメントと OPTION 句のクエリ ヒント

次は、OPTION 句で HASH JOIN クエリ ヒントを使用する SELECT ステートメントの例です。

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

D. SELECT ステートメントと OPTION 句のラベルと複数のクエリ ヒント

次の例は、ラベルと複数のクエリ ヒントを含む Azure Synapse Analytics SELECT ステートメントです。 クエリが計算ノードで実行されるとき、SQL Server は、SQL Server で最適であると判断された方針に基づいて、ハッシュ結合またはマージ結合を適用します。

-- Uses AdventureWorks  
  
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 クエリ ヒントを使用します。

-- Uses the AdventureWorks sample database
  
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. サブセレクトとクエリ ヒントを含むクエリ

次は、サブセレクトとクエリ ヒントの両方が含まれるクエリの例です。 クエリ ヒントはグローバルに適用されます。 クエリ ヒントはサブセレクト ステートメントに追加できません。

-- Uses the AdventureWorks sample database
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 ヒントを使用し、クエリで指定されている結合順序を使用するようにクエリ プランに強制します。 これですべてではありませんが、一部のクエリでパフォーマンスが改善されます。

-- Uses AdventureWorks  
  
-- Obtain partition numbers, boundary values, boundary value types, and rows per boundary  
-- for the partitions in the ProspectiveBuyer table of the ssawPDW database.  
SELECT sp.partition_number, prv.value AS boundary_value, lower(sty.name) AS boundary_value_type, sp.rows   
FROM sys.tables st JOIN sys.indexes si ON st.object_id = si.object_id AND si.index_id <2  
JOIN sys.partitions sp ON sp.object_id = st.object_id AND sp.index_id = si.index_id  
JOIN sys.partition_schemes ps ON ps.data_space_id = si.data_space_id   
JOIN sys.partition_range_values prv ON prv.function_id = ps.function_id   
JOIN sys.partition_parameters pp ON pp.function_id = ps.function_id   
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 の使用

次の例では、外部 Hadoop テーブルで MapReduce ジョブに WHERE 句を強制的にプッシュダウンします。

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

次の例では、外部 Hadoop テーブルで MapReduce ジョブに WHERE 句を強制的にプッシュダウンする行為を防止します。 すべての行は、WHERE 句が適用される PDW に戻ります。

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

参照

ヒント (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
DELETE (Transact-SQL)