Iam*_*mIC 3 sql-server stored-procedures query-hints optimizer-hints
我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示.我明白它是如何工作的.
不过,我有个问题在那里,并在使用它.它不能在UDF中指定.它可以在存储过程中指定.但是,这篇 MSDN博客文章陈述如下:
4.将查询移入存储过程可以将其置于单独的过程上下文中,并且可以是优化器可以看到该值的好方法(注意:这也适用于SQL 2000)
在我看来,传递给存储过程的任何参数都将被"嗅探",从而帮助SQL Server编译最佳执行计划.这意味着将重新访问/重新编译缓存的计划(不确定该机制).然而,这是令人困惑的,因为它否定了OPTIMIZE FOR UNKNOWN的全部需求.
关于查询提示的MSDN文章没有涵盖我的问题.
有人可以为我解答这个问题,理想情况下是指向微软的一些东西来解决这个问题.谢谢.
SQL编译器的默认行为是使用SP首次执行时给出的任何参数的值来帮助优化计划(请参阅本MSDN关于SP重新编译的文章的第2和第3段).然后,该计划被缓存重新使用,直到它离开缓存-很多细节上的计划缓存过程在这里.
您引用的MSDN博客注意到了使编译器更容易完成此过程的方法; 我认为第4项(在问题中引用)表明这是存储过程优于ad-hoc SQL的优势.
该OPTIMIZE FOR UNKNOWN提示指示编译器aviod默认行为; 它应该忽略第一次执行中给出的参数值,并选择更通用的计划.这是问题中引用的博客文章末尾的建议列表中第2项的更极端版本;
2如果您发现优化程序正在选择具有不同性能特征的不同计划,请考虑使用具有代表性"平均"值的参数提示,以获得对所有值合理运行的良好,通用查询计划.
但是,编译器将完全忽略参数值,而不是选择平均值或代表值.
考虑OPTIMIZE FOR UNKNOWN在第2项中引用的情况下使用- 当同一查询提供非常可变的性能时,因为计划在某些情况下很差 - 通常在查询中的参数过滤非常可变基数的列时.