Azure-Sql-Database

sys.dm_tran_version_store_space_usage 報告始終使用零空間

  • January 24, 2021

當我在 Azure SQL 數據庫上發現一些奇怪的東西時,我正在學習 RCSI。

DMVsys.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 數據庫在設計上對其父實例的範圍確實有限。這可能是根本原因嗎?

https://docs.microsoft.com/it-it/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-version-store-space-usage?view=sql-server-ver15

我知道 Azure SQL 數據庫預設在 RCSI 下執行,並且它們具有基於您獲得的層的固定數量的 tempdb 空間,所以我擔心用長時間執行的事務或其他程序來填充它,在版本儲存太久。但我無法管理我無法衡量的東西,對吧?

Azure SQL 數據庫使用加速數據庫恢復,因此 RCSI 不使用 TempDb 作為版本儲存。相反,版本儲存在數據庫內部以啟用“即時事務回滾”,這在故障轉移期間尤為重要:

持久版本儲存是一種數據庫引擎機制,用於持久儲存在數據庫本身中生成的行版本,而不是傳統的 tempdb 版本儲存。PVS 支持資源隔離並提高可讀輔助文件的可用性。

加速數據庫恢復

因此,您應該查看sys.dm_tran_persistent_version_store_stats或查看一般管理加速數據庫恢復

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