共用方式為


OPTION 子句 (Transact-SQL)

適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW) SQL 分析端點在 Microsoft Fabric SQL 資料庫中的 Microsoft 網架構倉儲中Microsoft網狀架構

指定所指出的查詢提示應該用於整個查詢。 雖然可以有多個查詢提示,不過每個查詢提示只能指定一次。 只有一個 OPTION 子句可以利用陳述式加以指定。

您可以在 SELECTDELETEUPDATEMERGE 陳述式中指定該子句。

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL 受控執行個體 和 Azure SQL 資料庫 的語法:

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

Microsoft Fabric 中倉儲的語法:

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

關鍵字,它們會指出要使用哪一個最佳化工具提示來自訂 Database Engine 處理陳述式的方式。 如需詳細資訊,請參閱查詢提示

範例

本文 Transact-SQL 程式碼範例使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。

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 和 Analytics Platform System (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. 含有子選擇和查詢提示的查詢

下列範例示範一個同時包含子選擇和查詢提示的查詢。 查詢提示會在全域套用。 查詢提示無法附加至子選取語句。

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 使用提示來強制查詢計劃使用查詢所指定的聯結順序。 此提示可改善某些查詢的效能,但並非所有查詢。

此查詢會取得資料庫數據表ssawPDWProspectiveBuyer數據分割的數據分割編號、界限值、界限值類型,以及每個界限的數據列。

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);

下列範例會防止將 子句下 WHERE 推至外部 Hadoop 數據表上的 MapReduce 作業。 所有數據列都會傳回套用 子句的 WHERE PDW。

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

I. 查詢某個時間點的資料

適用於:Microsoft Fabric 的倉儲

如需詳細資訊,請參閱 FOR TIMESTAMP 查詢提示

在 Microsoft Fabric 中 Synapse 資料倉儲中,使用 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