適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric プレビューの SQL データベース
クエリ全体で、指定のクエリ ヒントを使用する必要があることを指定します。 複数のクエリ ヒントを使用できますが、各クエリ ヒントを指定できるのは 1 回だけです。
OPTION
句はステートメントで 1 回だけ指定できます。
この句は、SELECT
、DELETE
、UPDATE
、および MERGE
ステートメントで指定できます。
Syntax
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
Arguments
query_hint
データベース エンジンのステートメント処理をカスタマイズするためのオプティマイザー ヒントを示すキーワードです。 詳細については、「クエリ ヒント」を参照してください。
Examples
この記事のコード サンプルでは、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 句のラベル
次の例は、SELECT
句にラベルを含む Azure Synapse Analytics OPTION
ステートメントを示しています。
SELECT * FROM FactResellerSales
OPTION (LABEL = 'q17');
C. SELECT ステートメントと OPTION 句のクエリ ヒント
次の例は、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. 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
ヒントを使用して、クエリ で指定された結合順序をクエリ プランで強制的に使用します。 このヒントを使用すると、一部のクエリのパフォーマンスが向上しますが、一部のクエリではパフォーマンスが向上しません。
このクエリは、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. Use 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