我已经阅读了 SQL Server 2008 OPTIMIZE FOR UNKNOWN 查询提示。我明白它是如何运作的。
不过,我有一个问题where and when使用它。不能在 UDF 内指定它。它可以在存储过程中指定。然而,thisMSDN 博客文章指出以下内容:
4.将查询移入存储过程可以将其放入单独的
程序上下文并且可以是一个很好的
使该值可见的方法
优化器(注意:这适用于 SQL
2000年也是如此)
在我看来,这似乎是说传递给存储过程的任何参数都将被“嗅探”,从而帮助 SQL Server 编译最佳执行计划。这意味着缓存的计划将被重新访问/重新编译(不确定该机制)。然而,这很令人困惑,因为它否定了 OPTIMIZE FOR UNKNOWN 的全部需要。
MSDN 关于查询提示的文章没有涵盖我的问题。
有人可以帮我回答这个问题吗,最好能指出微软的一些东西可以解决这个问题。谢谢。
SQL 编译器的默认行为是使用第一次执行 SP 时给出的任何参数的值来帮助优化计划(请参阅第 2 段和第 3 段)这篇关于 SP 重新编译的 MSDN 文章)。然后,该计划将被缓存以供重复使用,直到它离开缓存 - 有关计划缓存过程的大量详细信息here.
您引用的 MSDN 博客指出了使编译器更轻松地完成此过程的方法;我认为第 4 项(在问题中引用)表明这是存储过程相对于即席 SQL 的优势。
The OPTIMIZE FOR UNKNOWN
提示指示编译器避免默认行为;它应该忽略第一次执行中给出的参数值并选择更通用的计划。这是问题中引用的博客文章末尾建议列表中第 2 项的更极端版本;
2 如果你发现优化器是
随着时间的推移选择不同的计划
有不同的表现
特性,考虑使用
带代表的参数提示
“平均”值以获得良好的、常见的
合理运行的查询计划
对于所有值。
但编译器不会选择平均值或代表值,而是实际上完全忽略参数值。
考虑使用OPTIMIZE FOR UNKNOWN
在第 2 项中引用的情况下 - 当同一查询提供非常可变的性能时,因为计划在某些情况下很差 - 通常是当查询中的参数过滤基数非常可变的列时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)