执行计划缓存 - SMSS中的Ad Hoc查询与参数化查询

时间:2014-12-09 19:21:17

标签: sql-server

每当我在管理工作室中创建即席查询时,连续运行的查询没有任何更改都不显示任何解析/编译时间,因为看起来algebrizer已经为查询分配了一个哈希,它只是重用了该计划。对于一批查询,这甚至是正确的。但是,一旦我引入临时表的创建,它似乎永远不会缓存计划,因为我总是看到解析和编译时间几乎是执行时间的75%

另一方面,当我从Java应用程序运行相同的查询(创建临时表,使用它并删除它)时,我没有看到同样的症状。似乎每次对查询的连续调用都很快,从不会被解析/编译时间所困扰。不同之处在于查询已参数化并通过sp_executeSQL运行。

这使得在SSMS中调试查询变得困难,因为我无法使时间与应用程序保持一致。我是否需要实际接受我的即席查询并通过SSMS中的sp_executeSQL运行它以避免这种情况?

编辑:是的,通过sp_executeSQL运行它确实避免了解析时间。

1 个答案:

答案 0 :(得分:1)

好吧,the doc for sp_executeSQL says

  

可以使用sp_executesql代替存储过程来执行   当参数值发生变化时,Transact-SQL语句多次出现   声明是唯一的变化。因为Transact-SQL   语句本身保持不变,只有参数值   更改后,SQL Server查询优化器很可能会重用   它为第一次执行生成的执行计划。

您所看到的行为似乎就是这样。所以,是的,为了匹配应用程序的性能足迹,您可能需要使用sp_executesql

你可以做一些事情,比如使用计划提示或forcing query plans,但这看起来既丑陋又有风险。