我已经在SQL Server 2008上阅读了针对未知查询提示的优化。我了解它是如何工作的。

但是,我有一个问题 在哪里什么时候 使用它。它不能在UDF内指定。它可以在存储的Proc中指定。然而, 这个 MSDN博客文章指出以下内容:

4.将查询移入存储过程中可以将其置于单独的程序上下文中,并且可以是使优化器可见该值的好方法(注意:这也可以在SQL 2000中使用)

在我看来,这是在说传递给存储的Proc的任何参数将被“嗅探”,从而帮助SQL Server编译了最佳执行计划。这意味着将重新审视/重新编译缓存计划(不确定该机制)。但是,这是令人困惑的,因为它否定了对未知的优化的全部需求。

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

有人可以为我回答这个问题,理想情况下,将Microsoft的指针清除了。谢谢。

有帮助吗?

解决方案

SQL编译器的默认行为是使用SP的第一个执行中给出的任何参数的值来帮助优化计划(请参阅第2段和第3段 这篇有关SP重新编译的MSDN文章)。然后将该计划缓存以重复使用,直到离开缓存为止 - 计划缓存过程的大量细节 这里.

您引用的MSDN博客指出了使编译器更轻松的方法。我认为项目4(在问题中引用)暗示这是存储程序比临时SQL的优势。

OPTIMIZE FOR UNKNOWN 提示指示编译器对默认行为进行aviod;它应该忽略第一个执行中给出的参数值,然后选择一个更概括的计划。在问题中引用的博客文章末尾的建议列表中,这是项目2的更极端版本;

2如果您发现优化器随着时间的推移选择不同的性能特征的不同计划,请考虑使用具有代表性“平均”值的参数提示来获得一个良好的,常见的查询计划,该计划将适合所有值。

但是,编译器不会选择平均值或代表性值,而是有效地忽略了参数值。

考虑使用 OPTIMIZE FOR UNKNOWN 在项目2中引用的情况下 - 当相同的查询给出非常可变的性能时,因为计划在某些情况下很差 - 通常是当查询过滤器中的较可变基数的参数时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top