我已经看到了一些关于sys.dm_db_partition_stats.row_count
由于提供对象的统计信息而不是实际执行COUNT()
. 但是,我从未能够找到这些陈述背后的任何更深层次的原因,也无法在我的 Azure SQL DB 上验证假设。
所以我想学习——
- 这种方法 实际上有多不准确 ?
- 为什么结果可能会出现偏差?
(例如,统计数据仅每天重新计算一次/针对特定对象操作)。
非常感谢任何相关的见解!
我能够自己找出几件事——主要是通过运行各种包含 的查询sys.dm_db_partition_stats.row_count
,同时知道每个表中的实际行数。
这是我想出 的最后一个查询
这会变得快速且(在我的情况下)每个表的行数准确,从高到低排序。
SELECT
(SCHEMA_NAME(A.schema_id) + '.' + A.Name) as table_name,
B.object_id, B.index_id, B.row_count
FROM
sys.dm_db_partition_stats B
LEFT JOIN
sys.objects A
ON A.object_id = B.object_id
WHERE
SCHEMA_NAME(A.schema_id) <> 'sys'
AND (B.index_id = '0' OR B.index_id = '1')
ORDER BY
B.row_count DESC
子句的第一行WHERE
用于排除系统表,例如sys.plan_persist_wait_stats
和许多其他表。
第二行处理非唯一的非聚集索引(它们是对象并且显然有自己的统计信息)-> 如果您不将它们过滤掉,则在使用GROUP BY A.schema_id, A.Name
或两条相同的记录时,您将获得索引表的双倍行数table_name
在查询输出中(如果你不使用GROUP BY
)