设为首页 - 加入收藏 华夏网 ()- 云主机,资讯,互联网,人工智能,云计算,大赢家论坛,区块链,VR,站长网!
热搜: 系统 芯片 什么 市场
当前位置: 主页 > 水果奶奶论坛 > 正文

sql-server – 存储过程和OPTIMIZE FOR UNKNOWN

发布时间:2021-04-02 11:38 所属栏目:[水果奶奶论坛] 来源:网络整理
导读:我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示.我明白它是如何工作的. 但是,我有一个关于何时何地使用它的问题.它不能在UDF中指定.它可以在存储过程中指定.但是,this MSDN博客文章声明如下: 4.Moving a query into a stored procedure can put

我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示.我明白它是如何工作的.

但是,我有一个关于何时何地使用它的问题.它不能在UDF中指定.它可以在存储过程中指定.但是,this MSDN博客文章声明如下:

4.Moving a query into a stored procedure can put it into a separate
procedural context and can be a good
way to get that value visible to the
optimizer (Note: this works in SQL
2000 as well)

在我看来,传递给存储过程的任何参数都将被“嗅探”,从而帮助SQL Server编译最佳执行计划.这意味着将重新访问/重新编译缓存的计划(不确定该机制).然而,这是令人困惑的,因为它否定了OPTIMIZE FOR UNKNOWN的全部需求.

关于查询提示的MSDN文章没有涵盖我的问题.

有人可以为我解答这个问题,理想情况下,可以通过指向Microsoft的某些内容来解决这个问题.谢谢.

解决方法

SQL编译器的默认行为是使用SP首次执行时给出的任何参数的值来帮助优化计划(参见 this MSDN article on SP recompilation的第2和第3段).然后缓存该计划以供重用,直到它离开缓存 – 计划缓存过程 here的许多细节.

您引用的MSDN博客注意到了使编译器更容易完成此过程的方法;我认为第4项(在问题中引用)表明这是存储过程优于ad-hoc SQL的优势.

OPTIMIZE FOR UNKNOWN提示指示编译器避免默认行为;它应该忽略第一次执行中给出的参数值,并选择更通用的计划.这是问题中引用的博客文章末尾的建议列表中第2项的更极端版本;

2 If you find that the optimizer is
picking different plans over time that
have varying performance
characteristics,consider using a
parameter hint with a representative
“average” value to get a good,common
query plan that will work reasonably
for all values.

但是,编译器将完全忽略参数值,而不是选择平均值或代表值.

考虑在第2项中引用的情况下使用OPTIMIZE FOR UNKNOWN – 当相同的查询提供非常可变的性能时,因为在某些情况下计划很差 – 通常在查询中的参数过滤非常可变基数的列时.

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章