sys.dm_tran_version_store_space_usage 報告始終使用零空間
當我在 Azure SQL 數據庫上發現一些奇怪的東西時,我正在學習 RCSI。
DMV
sys.dm_tran_version_store_space_usage
始終將 0 報告為版本儲存使用的空間,即使我之前執行了 CRUD 工作負載。為了展示這種行為,我創建了一個小測試。
-- Server info select @@version as sql_version; -- Database info select is_read_committed_snapshot_on, snapshot_isolation_state_desc from sys.databases where database_id = db_id(); -- Just to be sure the current database has its version store empty select reserved_page_count as pre_workload_space_count from sys.dm_tran_version_store_space_usage where database_id = db_id(); -- Test workload drop table if exists RCSI_TEST; create table RCSI_TEST ( id uniqueidentifier default newid() ); go insert into RCSI_TEST default values; go 100 update RCSI_TEST set id = newid(); delete from RCSI_TEST; -- Metrics select reserved_page_count as post_workload_page_count from sys.dm_tran_version_store_space_usage where database_id = db_id(); waitfor delay '00:01:30'; -- Just to be sure! ;) select reserved_page_count as post_cleaning_space_count from sys.dm_tran_version_store_space_usage where database_id = db_id();
我在 SQL Server 2019 Developer Edition(在 Docker 上)和 Azure SQL 數據庫(層 S0、10DTU)上執行了這個腳本,結果如下。
SQL Server 2019
sql_version Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64)Sep 23 2020 16:03:08 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Linux (Ubuntu 18.04.5 LTS) <X64> is_read_committed_snapshot_on snapshot_isolation_state_desc 1 ON pre_workload_space_count 0 post_workload_page_count 8 post_cleaning_space_count 0
Azure SQL 數據庫
sql_version Microsoft SQL Azure (RTM) - 12.0.2000.8 Oct 1 2020 18:48:35 Copyright (C) 2019 Microsoft Corporation is_read_committed_snapshot_on snapshot_isolation_state_desc 1 ON pre_workload_space_count 0 post_workload_page_count 0 post_cleaning_space_count 0
SQL Server 2019 似乎表現正確,在工作負載之後立即在版本儲存中報告 8 頁的數據,然後在一分鐘左右後清理。但是,在 Azure SQL 數據庫上,使用的空間始終為零!這是正確的行為嗎?這是什麼意思?
聯機叢書報告此 DMV 與 SQL Server 和 Azure SQL 數據庫兼容,但還說*“以下查詢可用於確定 tempdb 中消耗的空間,按SQL Server 實例中每個數據庫的版本儲存。 ”*。據我所知,Azure SQL 數據庫在設計上對其父實例的範圍確實有限。這可能是根本原因嗎?
我知道 Azure SQL 數據庫預設在 RCSI 下執行,並且它們具有基於您獲得的層的固定數量的 tempdb 空間,所以我擔心用長時間執行的事務或其他程序來填充它,在版本儲存太久。但我無法管理我無法衡量的東西,對吧?
Azure SQL 數據庫使用加速數據庫恢復,因此 RCSI 不使用 TempDb 作為版本儲存。相反,版本儲存在數據庫內部以啟用“即時事務回滾”,這在故障轉移期間尤為重要:
持久版本儲存是一種數據庫引擎機制,用於持久儲存在數據庫本身中生成的行版本,而不是傳統的 tempdb 版本儲存。PVS 支持資源隔離並提高可讀輔助文件的可用性。
因此,您應該查看
sys.dm_tran_persistent_version_store_stats
或查看一般管理加速數據庫恢復