BanksySan Asked: 2016-10-19 10:52:19 +0800 CST2016-10-19 10:52:19 +0800 CST 2016-10-19 10:52:19 +0800 CST 查找 OPTIMIZE FOR UNKNOWN 正在使用的值 772 如果我的OPTIMIZE FOR UNKNOWN存储过程中有一个,我是否能够看到数据库决定的最佳值是多少? sql-server performance 2 个回答 Voted Best Answer Brent Ozar 2016-10-19T11:00:51+08:002016-10-19T11:00:51+08:00 OPTIMIZE FOR UNKNOWN 不使用值 - 相反,它使用密度向量。 如果您运行 DBCC SHOWSTATISTICS,它是第二个结果集的“所有密度”列中列出的值: 在此示例中,我使用的是 StackOverflow 演示数据库。Reputation 列的密度向量是 5.962674E-05。 如果您将该值乘以表中的行数,5.962674E-05 * 5277831,您将得到 314.69985680094。这是 SQL Server 期望为任何给定的信誉过滤器返回的行数。 Hannah Vernon 2016-10-19T10:59:58+08:002016-10-19T10:59:58+08:00 Benjamin NevarezOPTIMIZE 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。
OPTIMIZE FOR UNKNOWN 不使用值 - 相反,它使用密度向量。
如果您运行 DBCC SHOWSTATISTICS,它是第二个结果集的“所有密度”列中列出的值:
在此示例中,我使用的是 StackOverflow 演示数据库。Reputation 列的密度向量是 5.962674E-05。
如果您将该值乘以表中的行数,5.962674E-05 * 5277831,您将得到 314.69985680094。这是 SQL Server 期望为任何给定的信誉过滤器返回的行数。
Benjamin Nevarez
OPTIMIZE FOR UNKNOWN
在他的博客上有一篇很好的文章本质上,SQL Server 使用有关表的统计信息和数学来确定要使用的值。
从他的帖子: