分享方式:


OPTION 子句 (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

指定所指出的查詢提示應該用於整個查詢。 雖然可以有多個查詢提示,不過每個查詢提示只能指定一次。 只有一個 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

注意

若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

query_hint

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

範例

本文中的 Transact-SQL 程式代碼範例會使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,您可以從 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