EXISTS 子句的 SQL Server 查询提示

Posted

技术标签:

【中文标题】EXISTS 子句的 SQL Server 查询提示【英文标题】:SQL Server Query Hints for EXISTS Clause 【发布时间】:2017-07-29 17:32:40 【问题描述】:

我正在尝试强制 SQL 服务器对存在子句使用哈希匹配,如下所示。

Execution Plan

FROM 
    [Dbo].[360 Nrc Data] AS [nrc]
WHERE 
    [CALENDAR_DATE] BETWEEN @START_DATE AND @End_Date
    AND EXISTS (SELECT 1
                FROM [staging].[FACT_DTV_RETENTION_EVENT_STEP_1] AS [fact]
                WHERE [fact].[CD_PORTFOLIO_ID] = [nrc].[Cd_Portfolio_Id]
                  AND [fact].[Event_Date] = [nrc].[CALENDAR_DATE])
GROUP BY 
    [Calendar_Date], [Cd_Portfolio_Id])

强制查询提示的正常方法如下,但 Left Semi Join 比 has join 更有效

[_fact_date_and_portfolio] AS [fact]    
     inner hash join    

     [dbo].[360 TA Offer] AS [offr]

【问题讨论】:

为什么要强制进行哈希匹配?适当的索引可能会更快。 doing > 10M join,我想强制是因为很多时候 SQL Server 得到行估计错误。 【参考方案1】:

没有提示语法来指定特定半连接或反半连接运算符的物理连接类型。

但由于此计划只有一个连接,您只需将OPTION (HASH JOIN) 添加到查询末尾即可。该提示适用于所有联接,但没有任何其他联接。

【讨论】:

以上是关于EXISTS 子句的 SQL Server 查询提示的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sql server exists 子句进行优化?

SQL Server 查询表值参数的短路 EXISTS 语句

SQL Server查询表值参数的短路EXISTS语句

带有“exists”子句和多个表的 SQL 子查询

Sql server not in优化

SQL Group By and Have 子句和 exists 子句