哪些 SET 选项会影响计划重用以及如何在 T-SQL 中获取它们的值?

Mar*_*lli 0 performance sql-server optimization plan-cache sql-server-2014 query-performance

当存储过程在任何时候从管理工作室运行良好时,我正在对这种情况进行故障排除,但即使对于相同的参数,相同的存储过程在其中一个网络服务器中运行得非常糟糕。可能有一些原因导致这种情况,包括阻塞等。

我想排除使用不同 SET 选项创建 2 个不同计划的可能性,并且这些计划中至少有一个使用产生错误计划的参数组合进行了优化。

引用本杰明·内瓦雷斯:

“一般来说,查询优化是一个代价高昂的操作,为了避免这种优化成本,计划缓存会尽量将生成的执行计划保存在内存中,以便它们可以被重用。但是,如果一个新的连接运行相同的存储过程有不同的SET选项,它可能会生成一个新的计划……”

为了解决这个问题,我想要一个 T-SQL 查询,它会显示为会话设置的所有值。

这可能吗?

以下 SET 选项将影响执行计划的重用:

(他们中的一些)

DATEFORMAT
LANGUAGE
NUMERIC_ROUNDABORT
FORCEPLAN

Jam*_*s Z 5

如果是不同选项导致使用不同计划的情况,只需使用sys.dm_exec_plan_attributes检查选项。如果好的和坏的计划的选项不同,那么这可能就是原因。

可以在Martin Smith的以下回答中找到计划缓存键列表:

什么会导致参数嗅探一台计算机而不是另一台计算机?