OPTION 句 (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database
クエリ全体で、指定のクエリ ヒントを使用する必要があることを指定します。 複数のクエリ ヒントを使用できますが、各クエリ ヒントを指定できるのは 1 回だけです。 OPTION
句はステートメントで 1 回だけ指定できます。
この句は、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 and Analytics Platform System (PDW) および SQL Analytics エンドポイントの構文:
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 サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
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 句のラベル
次の例は、OPTION
句にラベルを含む Azure Synapse Analytics SELECT
ステートメントを示しています。
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 によってハッシュ結合またはマージ結合が適用されます。
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. サブセレクトとクエリ ヒントを含むクエリ
次は、サブセレクトとクエリ ヒントの両方が含まれるクエリの例です。 クエリ ヒントはグローバルに適用されます。 サブセレクト ステートメントにクエリ ヒントを追加することはできません。
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
ヒントを使用して、クエリ で指定された結合順序をクエリ プランで強制的に使用します。 このヒントを使用すると、一部のクエリのパフォーマンスが向上しますが、一部のクエリではパフォーマンスが向上しません。
このクエリは、ssawPDW
データベースのProspectiveBuyer
テーブル内のパーティションのパーティション番号、境界値、境界値の種類、および境界ごとの行を取得します。
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 を使用する
次の例では、外部 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);
I. 特定の時点のデータのクエリを実行する
適用対象:Microsoft Fabric のウェアハウス
詳細については、「FOR TIMESTAMP クエリのヒント」を参照してください。
TIMESTAMP
句の OPTION
構文を使用して、Microsoft Fabric の Synapse Data Warehouse で、過去に存在していたデータのクエリを実行します。 次のサンプル クエリでは、2024 年 3 月 13 日 7:39:35.28 PM 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