DBCC CHECKDB 和 DBCC CHECKTABLE 在表级完整性检查上有什么具体区别吗?

Elv*_*dov 0 sql-server dbcc-checkdb sql-server-2016 dbcc-checktable

我在其中一个数据库上运行 DBCC CHECKDB 时遇到了分配错误。它抛出以下错误:

消息 8947,级别 16,状态 1,第 5 行表错误:对象 ID 1277199566、索引 ID 1、分区 ID 720577176766669456、分配单元 ID 720577087666647328 的多个 IAM 页(类型 LOB 数据)包含间隔。IAM 页面 (1:425664) 和 (1:1422669)。

CHECKDB 在表“schemaName.tableName”(对象 ID 1277199566)中发现 1 个分配错误和 0 个一致性错误。CHECKDB 在数据库“databaseName”中发现 1 个分配错误和 0 个一致性错误。

奇怪的是,当我尝试在该表上运行 DBCC CHECKTABLE 时,它没有显示任何错误。此外,我尝试运行 CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS 选项,但没有出现任何错误。

根据 Microsoft 文档:

要对数据库中的每个表执行 DBCC CHECKTABLE,请使用 DBCC CHECKDB。

对于指定的表,DBCC CHECKTABLE 检查以下内容:

  • 索引、行内、LOB 和行溢出数据页正确链接。
  • 索引按正确的排序顺序排列。
  • 指针是一致的。
  • 每页数据合理,包括计算列。
  • 页面偏移是合理的。
  • 基表中的每一行在每个非聚集索引中都有一个匹配的行,反之亦然。
  • 分区表或索引中的每一行都在正确的分区中。
  • 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时文件系统和表之间的链接级一致性

但正如我所看到的,相反的情况并非如此。我们不能只对一张表运行 CHECKTABLE 并为同一张表获得相同的结果。

在检查特定对象的完整性和一致性方面,是否有人拥有与这两个命令之间的差异相关的信息?

Pau*_*ite 5

DBCC CHECKDB

通过执行以下操作检查指定数据库中所有对象的逻辑和物理完整性:

  • 在数据库上运行DBCC CHECKALLOC
  • 对数据库中的每个表和视图运行DBCC CHECKTABLE
  • 在数据库上运行DBCC CHECKCATALOG
  • 验证数据库中每个索引视图的内容。
  • 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时,验证表元数据与文件系统目录和文件之间的链接级一致性。
  • 验证数据库中的 Service Broker 数据。

跑步DBCC CHECKTABLE只是这些步骤之一。

要查看分配错误,您需要运行DBCC CHECKALLOC.

DBCC CHECKTABLE确实对属于该对象的页面执行广泛的检查。它不会检查可能以不一致的方式引用表的数据库范围的分配元数据。DBCC CHECKALLOC执行这些检查。