我有这个非常简单的查询:
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作业代理默认将“QUOTED_IDENTIFIER”设置为“OFF”。
执行'SET QUOTED_IDENTIFIER ON'将使语句使用预期的执行计划
但我仍然不知道为什么会这样。