iva*_*nmp 16 performance sql-server-2005 sql-server optimization query-performance
我有两个几乎相同的查询在同一个 SQL Server 2005 实例上运行:
SELECT
由 LINQ 生成的原始查询(我知道,我知道......我不是应用程序开发人员,只是 DBA :)。OPTION (RECOMPILE)
在最后加了一个。没有其他任何改变。
第一个每次运行需要 55 秒。
第二个需要 2 秒。
两个结果集是相同的。
为什么这个提示会产生如此显着的性能提升?
在线图书条目RECOMPILE
没有提供非常详细的解释:
指示 SQL Server 数据库引擎在执行后放弃为查询生成的计划,强制查询优化器在下次执行相同查询时重新编译查询计划。在不指定 RECOMPILE 的情况下,数据库引擎会缓存查询计划并重用它们。编译查询计划时,RECOMPILE 查询提示使用查询中任何局部变量的当前值,如果查询在存储过程中,则将当前值传递给任何参数。
RECOMPILE 是创建使用 WITH RECOMPILE 子句的存储过程的一种有用的替代方法,当必须重新编译存储过程中的查询子集而不是整个存储过程时。有关详细信息,请参阅重新编译存储过程。RECOMPILE 在您创建计划指南时也很有用。有关更多信息,请参阅使用计划指南优化已部署应用程序中的查询。
由于我的查询有很多局部变量,我的猜测是当我使用OPTION (RECOMPILE)
查询提示时,SQL Server 能够(认真地)优化它。
我所看到的每个地方都有人说OPTION (RECOMPILE)
应该避免这种情况。对此的解释通常是使用此提示 SQL Server 无法重用此执行计划,因此每次都必须浪费时间重新编译它。
(但是)考虑到巨大的性能优势,我倾向于认为这次使用这个查询提示会是一件好事。
我应该使用它吗?如果没有,有没有一种方法可以强制 SQL Server 使用更好的执行计划而无需此提示且无需更改应用程序?
Mar*_*ith 16
如Microsoft SQL Server 2005 中的查询优化器使用的统计一文中所述
如果您在查询谓词中使用局部变量而不是参数或文字,优化器将求助于降低质量的估计,或对谓词选择性的猜测。在查询中使用参数或文字而不是局部变量
当优化器在所有的一列没有可用统计它将猜测,一个=
谓词将匹配的行,10%BETWEEN
9%,和任何的>, >=, < and <=
将匹配30%。如果有可用的列统计信息,则=
谓词将被区别对待,如下所示。
即使在查询中使用局部变量时,在等式谓词的情况下也使用比猜测更好的估计。
@local_variable = column_name
使用来自 column_name 直方图的平均值频率估计形式“ ”的条件的选择性。因此,例如,如果列 column_name 包含所有唯一值,则将使用的选择性估计值1/(number of unique values in column)
是准确的。
所以这与使用 for 本质上是一样的OPTIMIZE FOR (UNKNOWN)
。它可能比平面10%
猜测更准确,但它不是针对您正在查询的特定值量身定制的。
要强制 SQL Server 在每次运行时优化查询,并在查询优化期间使用局部变量的值来估计基数和成本,请在查询中添加
RECOMPILE
查询提示。
使用RECOMPILE
您可能会获得更准确的基数估计,因此具有连接顺序/连接类型的不同计划更适合从实际查询的不同部分返回的行数。
归档时间: |
|
查看次数: |
2429 次 |
最近记录: |