从 SQL 作业代理执行时具有不同执行计划的简单查询
Simple query with different execution plan when executed from SQL Job agent
我有这个非常简单的查询:
IF EXISTS (SELECT 1 FROM system.RawEvent_pool1 WHERE ProcessedDate IS NULL)
EXECUTE [system].[usp_ProcessAuditData] '1'
我在系统上有一个过滤索引。RawEvent_pool1。
它是在 ProcessedDate IS NULL 上过滤的
(ProcessedDate 包含在索引中)
因此索引应该与此查询完美匹配。
从实际执行计划中,我可以看出,当从 Management Studio 执行时,索引按预期使用。
但是当从 SQL 作业代理对同一数据库执行完全相同的查询时,不会使用索引。
相反,查询计划在 table 的主键上使用聚簇索引。
我可以在查询存储中看到这个。
附加信息:作业在不同的帐户下执行。
对于这种行为有什么合乎逻辑的解释吗?
那我很想听听:-)
找到原因了。
SQL 作业代理已将 'QUOTED_IDENTIFIER' 默认设置为 'OFF'。
执行'SET QUOTED_IDENTIFIER ON'将使语句使用预期的执行计划
但我仍然不知道为什么会这样。
我有这个非常简单的查询:
IF EXISTS (SELECT 1 FROM system.RawEvent_pool1 WHERE ProcessedDate IS NULL)
EXECUTE [system].[usp_ProcessAuditData] '1'
我在系统上有一个过滤索引。RawEvent_pool1。
它是在 ProcessedDate IS NULL 上过滤的 (ProcessedDate 包含在索引中)
因此索引应该与此查询完美匹配。
从实际执行计划中,我可以看出,当从 Management Studio 执行时,索引按预期使用。
但是当从 SQL 作业代理对同一数据库执行完全相同的查询时,不会使用索引。
相反,查询计划在 table 的主键上使用聚簇索引。
我可以在查询存储中看到这个。
附加信息:作业在不同的帐户下执行。
对于这种行为有什么合乎逻辑的解释吗?
那我很想听听:-)
找到原因了。
SQL 作业代理已将 'QUOTED_IDENTIFIER' 默认设置为 'OFF'。
执行'SET QUOTED_IDENTIFIER ON'将使语句使用预期的执行计划
但我仍然不知道为什么会这样。