我迷失了一件事。根据 MS docs full checkdb without option does column-value checks,那么运行 data_purity 有什么好处?我所说的“增益”是指进行了多么详细的检查,我现在不考虑性能。
我是否理解正确,如果数据库是在 SQL2005 之前创建的,它将 dbi_dbccFlags 设置为 0 并且完整的 checkdb 将跳过列值检查,但是一旦此类数据库将至少有一个成功的 data_purity 检查,该标志将设置为 2 并且在每个完整的 checkdb 期间都会进行列值检查?如果数据库是在 SQL2005+ 中创建的,它将默认将 dbi_dbccFlags 设置为 2,然后完全 checkdb 没有选项和 data_purity 将是相同的检查?
估计也似乎表明,对于 SQL2005+,这两个检查之间没有区别,至少在 TempDB 所需的空间方面:
- DBCC CHECKDB('AdventureWorks2019') WITH PHYSICAL_ONLY, ESTIMATEONLY
“AdventureWorks2019”的 DBCC 结果。
数据库 AdventureWorks2019 上的 CHECKDB 所需的估计 TEMPDB 空间(以 KB 为单位)= 39189。
- DBCC CHECKDB('AdventureWorks2019') WITH ESTIMATEONLY
“AdventureWorks2019”的 DBCC 结果。
数据库 AdventureWorks2019 上的 CHECKDB 所需的估计 TEMPDB 空间(以 KB 为单位)= 225996。
- DBCC CHECKDB('AdventureWorks2019') WITH DATA_PURITY, ESTIMATEONLY
“AdventureWorks2019”的 DBCC 结果。
数据库 AdventureWorks2019 上的 CHECKDB 所需的估计 TEMPDB 空间(以 KB 为单位)= 225996。
是的,这是正确的。您只需要在 2005 年之前创建的数据库上启用运行 CHECKDB 的 DATA_PURITY 选项一次,如果结果是干净的,那么没有该选项的后续 CHECKDB 将自动包含检查。它是 2005 年及以上创建的数据库中标准 CHECKDB 流程的一部分。
那是因为它是相同的检查过程——该选项在 SQL2005+ 创建的数据库中不会有任何影响,因为 CHECKDB 将检查作为标准。