OPTION 子句 (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库

指定应在整个查询中使用所指定的查询提示。 每个查询提示只能指定一次,但允许指定多个查询提示。 使用该语句只能指定一个 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