找到 OPTIMIZE FOR UNKNOWN 正在使用的值

Ban*_*San 7 performance sql-server stored-procedures optimization plan-cache

如果我的OPTIMIZE FOR UNKNOWN存储过程中有一个,我是否能够看到数据库确定的最佳值?

Bre*_*zar 17

OPTIMIZE FOR UNKNOWN 不使用值 - 相反,它使用密度向量。

如果您运行 DBCC SHOWSTATISTICS,它是在第二个结果集的“所有密度”列中列出的值:

dbo.Users.IX_Reputation 的 DBCC SHOW_STATISTICS

在本例中,我使用的是 StackOverflow 演示数据库。声誉列的密度向量是 5.962674E-05。

如果你取这个值,乘以表中的行数,5.962674E-05 * 5277831,你得到 314.69985680094。这是 SQL Server 期望为任何给定的信誉过滤器返回的行数。


Han*_*non 5

本杰明·内瓦雷斯 (Benjamin Nevarez)OPTIMIZE FOR UNKNOWN在他的博客上有一篇很好的文章

本质上,SQL Server 使用有关表的统计信息和数学来确定要使用的值。

从他的帖子:

密度定义为 1 / 不同值的数量。SalesOrderDetail 表有 266 个不同的 ProductID 值,因此密度计算为 1 / 266 或 0.003759399,如之前在统计对象上所示。SQL Server 使用的统计数学模型中的一个假设是一致性假设。由于在这种情况下 SQL Server 不能使用直方图,因此均匀性假设表明对于任何给定值,数据分布都是相同的。要获得估计的记录数,SQL Server 会将密度乘以当前的总记录数,即 0.003759399 * 121,317 或 456.079,如计划中所示。这也与将记录总数除以不同值的数量(121,317 / 266)相同,也就是 456.079。