SELECT
OBJECT_SCHEMA_NAME(a.object_id) AS schema_
,OBJECT_NAME(a.object_id) AS tbl
,a.index_id
--,*
FROM sys.dm_db_database_page_allocations(DB_ID('Adventureworks'), NULL, null, null, 'DETAILED') AS a
CROSS APPLY sys.dm_db_page_info ( DB_ID(), a.allocated_page_file_id, a.allocated_page_page_id, 'LIMITED' ) AS p
WHERE p.has_checksum = 0
AND p.page_type IN(1, 2)
SELECT
OBJECT_SCHEMA_NAME(a.object_id) AS schema_
,OBJECT_NAME(a.object_id) AS tbl
,a.index_id
,SUM(CAST(p.has_checksum AS int)) AS pages_with_checksum
,SUM(CASE p.has_checksum WHEN 1 THEN 0 ELSE 1 END) AS pages_without_checksum
--,*
FROM sys.dm_db_database_page_allocations(DB_ID('Adventureworks'), NULL, null, null, 'DETAILED') AS a
CROSS APPLY sys.dm_db_page_info ( DB_ID(), a.allocated_page_file_id, a.allocated_page_page_id, 'LIMITED' ) AS p
WHERE p.page_type IN(1, 2)
AND OBJECTPROPERTY(a.object_id, 'IsMsShipped') = 0 --Filter out system tables
GROUP BY
OBJECT_SCHEMA_NAME(a.object_id)
,OBJECT_NAME(a.object_id)
,a.index_id
ORDER BY pages_without_checksum DESC, pages_with_checksum DESC
校验和不在对象或索引级别(在此上下文中也称为分配单元)。它在页面级别。
即,一个分配单元可以有一些没有校验和的页面(那些在你打开校验和之后没有被修改过的页面)而其他页面确实有校验和(那些在你打开校验和之后已经被修改过的页面)。
所以你必须查看页面级别,看看每个页面是否有校验和。下面可以作为您的起点,但您可能希望根据自己的需要进行定制。
请注意,在编写时它会读取数据库中的每一页。因此,请考虑是否要使用 sys.dm_db_database_page_allocations 的参数并仅为您感兴趣的那些表/索引运行它。
当然,您也可以汇总和计算带有/不带有校验和等的页面数。这是另一个版本:
sys.dm_db_page_info
在 SQL Server 2019 中添加了注释。