存储过程和OPTIMIZE FOR UNKNOWN

时间:2010-12-04 05:56:45

标签: sql-server stored-procedures query-hints optimizer-hints

我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示。我理解它是如何工作的。

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

  

4.将查询移动到存储过程可以将其放入单独的   程序上下文可以是一个好的   获得该值可见的方法   优化器(注意:这适用于SQL   2000年以及)

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

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

有人可以为我解答这个问题,理想情况下是指向微软的一些指针可以解决这个问题。感谢。

1 个答案:

答案 0 :(得分:7)

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

您引用的MSDN博客正在注意如何让编译器更轻松地完成此过程;我认为第4项(在问题中引用)表明这是存储过程优于ad-hoc SQL的优势。

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

  

2如果您发现优化器是   随着时间推移采取不同的计划   有不同的表现   特点,考虑使用a   参数提示与代表   获得良好,共同的“平均”价值   查询计划将合理地工作   所有价值观。

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

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