当我这样做时,dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)
我会得到报告 ID 18698 的以下结果:
对于此查询:
SELECT *
FROM Reports_Documents
WHERE ReportID = 18698 option (recompile)
Run Code Online (Sandbox Code Playgroud)
我得到一个查询计划,PK_Reports_Documents
按预期进行聚集索引搜索。
但让我感到困惑的是估计行数的错误值:
根据这个:
当示例查询 WHERE 子句值等于直方图 RANGE_HI_KEY 值时,SQL Server 将使用直方图中的 EQ_ROWS 列来确定等于的行数
这也是我所期望的方式,但在现实生活中似乎并非如此。我还尝试RANGE_HI_KEY
了由提供的直方图中存在的一些其他值,show_statistics
并经历了相同的情况。在我的情况下,这个问题似乎导致某些查询使用非常不理想的执行计划,导致执行时间为几分钟,而我可以通过查询提示在 1 秒内运行它。
总而言之:有人可以解释一下为什么EQ_ROWS
直方图没有用于估计的行数,不正确的估计来自哪里?
更多(可能有用)信息:
PK_Reports_Documents
是一个组合PK,由ReportID INT
和DocumentID CHAR(8)
该查询似乎总共加载了 5 个不同的统计对象,所有这些对象都包含ReportID
表中的 + 一些其他列。它们都已新鲜更新。RANGE_HI_KEY
下表中是直方图中的最高上限列值。
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| name | stats_id | auto_created | user_created | Leading column Type …
Run Code Online (Sandbox Code Playgroud)