Dbcc-Checkdb

dbcc checkdb 在physical_only、full 和data_purity 之間的區別

  • March 25, 2021

我迷失了一件事。根據 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。

我是否理解正確,如果數據庫是在 SQL2005 之前創建的,它將 dbi_dbccFlags 設置為 0 並且完整的 checkdb 將跳過列值檢查,但是一旦此類數據庫將至少有一個成功的 data_purity 檢查,該標誌將設置為 2 和在每個完整的 checkdb 期間都會進行列值檢查?如果數據庫是在 SQL2005+ 中創建的,它將預設將 dbi_dbccFlags 設置為 2,然後完全 checkdb 沒有選項和 data_purity 將是相同的檢查?

是的,這是正確的。您只需要在 2005 年之前創建的數據庫上啟用執行 CHECKDB 的 DATA_PURITY 選項一次,如果結果是乾淨的,那麼沒有該選項的後續 CHECKDB 將自動包含檢查。它是 2005 年及以上創建的數據庫中標準 CHECKDB 流程的一部分。

此外估計似乎表明對於 SQL2005+,這兩個檢查之間沒有區別,至少在 TempDB 所需空間方面

那是因為它是相同的檢查過程——該選項在 SQL2005+ 創建的數據庫中不會有任何影響,因為 CHECKDB 將檢查作為標準。

引用自:https://dba.stackexchange.com/questions/287720