OPTION 子句 (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

指定应在整个查询中使用所指定的查询提示。 每个查询提示只能指定一次,但允许指定多个查询提示。 使用该语句只能指定一个 OPTION 子句。

可以在 SELECTDELETEUPDATEMERGE 语句中指定该子句。

Transact-SQL 语法约定

语法

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

关键字,指示优化器提示用于自定义数据库引擎处理语句的方式。 有关详细信息,请参阅查询提示

示例

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 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. 在 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 提示来强制查询计划使用查询指定的联接顺序。 此提示可提高某些查询的性能,但并非所有查询。

此查询为数据库中的 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. 使用 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 查询提示

使用 OPTION 子句中的 TIMESTAMP 语法,查询 Microsoft Fabric Synapse 数据仓库中过去存在的数据。 以下查询示例返回 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