首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server使用参数化SQL缓存具有相同查询的查询计划

Server使用参数化SQL缓存具有相同查询的查询计划
EN

Database Administration用户
提问于 2014-09-11 23:49:54
回答 1查看 978关注 0票数 2

我在Server 2012 SP1中使用参数化SQL查询。

参考sys.dm_exec_cached_planssys.dm_exec_query_stats,似乎优化器多次创建相同的计划,而不是重用已经存在的计划。

服务器有大量缓存计划,具有相同的query_hashquery_plan_hash (目前只有4700个计划,而且还在增加)。

我的问题是:

  1. 这种情况正常吗?
  2. 为什么优化器一次又一次地创建一个已经存在的新计划?
  3. 是否有一个好的方法强制优化器重用查询计划的参数化SQL?
EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-09-12 09:13:38

这里有几个不同的问题:

Q:为什么优化器一次又一次地创建一个已经存在的新计划?

这些属性都会影响计划重用:

  • 不同的数据库各有各自的计划。
  • 不同的参数长度有它们自己的计划(特别是在这个NHibernate错误中,但类似的问题也可能发生在其他ORM中)
  • 不同的连接设置(如ANSI NULL )可以获得它们自己的计划。
  • 不同的间距或注释可以得到自己的计划(例如,如果您的代码动态添加注释以指示查询来自何处)

问:是否有一种好的方法来强制优化器重用查询计划?

是的--想想上面那些会影响计划重用的事情。显然,如果您有一个软件即服务类型模型,其中每个客户端都有自己的数据库,那么您不能真正帮助那里的事情,但是您可以帮助其他两个因素。与应用程序的连接设置保持一致,不要向查询中动态注入不同的间距或注释,并确保应用程序中的数据类型与数据库中的数据类型相匹配。

问:这种情况正常吗?

在这个领域中看到这种情况并不少见,特别是在旧的NHibernate/EF版本中,这些版本根据传入的任何参数使用不同的参数长度(如该链接中所讨论的)。

其性能症状是CPU使用率更高(由于查询编译次数增加)和计划缓存内存使用量更高,但它们通常不是Server上最大的问题。

票数 10
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/76368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档