从SQL作业代理执行时,使用不同的执行计划进行简单查询

问题描述 投票:0回答:1

我有这个非常简单的查询:

IF EXISTS (SELECT 1 FROM system.RawEvent_pool1 WHERE ProcessedDate IS NULL)
EXECUTE [system].[usp_ProcessAuditData] '1'

我在system.RawEvent_pool1上有一个过滤索引。

它在ProcessedDate IS NULL上过滤(ProcessedDate包含在索引中)

所以索引应该是这个查询的完美匹配。

从实际执行计划中,我可以看出,从Management Studio执行时,索引按预期使用。

但是,当从SQL作业代理在同一数据库上执行完全相同的查询时,不使用索引。

相反,查询计划使用表的主键上的聚簇索引。

我可以在Query Store中看到这一点。

附加信息:作业在不同的帐户下执行。

这种行为有合理的解释吗?

然后我很乐意听到它:-)

sql-server sql-execution-plan
1个回答
0
投票

找到原因。

SQL作业代理默认将“QUOTED_IDENTIFIER”设置为“OFF”。

执行'SET QUOTED_IDENTIFIER ON'将使语句使用预期的执行计划

但我仍然不知道为什么会这样。

© www.soinside.com 2019 - 2024. All rights reserved.