次の方法で共有


OPTION 句 (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

この句は、SELECTDELETEUPDATE、および 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 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