SQL Server中TempDB管理(版本存儲區的一個example)

我們從一個例子開始來了解版本存儲區。本例中數據庫啟用RCSI(使用行版本控制的已提交讀隔離級別) 和 SI( 快照隔離級別 )。 當數據庫啟用了RCSI或者SI時,每當行有更新時就會創建一個行版本。此行版本在版本存儲器保存到不需要為止。那么SQL Server什么時候

我們從一個例子開始來了解版本存儲區。本例中啟用rcsi(使用行版本控制的已提交讀隔離級別)si(快照隔離級別)。

當數據庫啟用了RCSI或者SI時,每當行有更新時就會創建一個行版本。此行版本在版本存儲器保存到不需要為止。那么SQL Server什么時候不再保存這個行版本呢?您可能到一些相關的問題,比如,如果不回收(刪除)行版本會有什么影響?一次回收一個還是一組行版本?每個用戶表都有不同的結構,那么SQL Server是不是分別存儲每個表的行版本的?行版本控制的開銷大不大?

首先,我們創建一個數據庫并開啟SI/RCSI

createdatabasesnapshottest

go

?

— Setting databaseforsnapshot based isolations. AS you can

— see that enabling SI/RCSI is a simple DDL operation.

alterdatabase snapshottest setread_committed_snapshotON

go

?

alterdatabase snapshottest setallow_snapshot_isolationON

go

?

— check the snapshot state of the database and it will

— show that both SI and RCSI have been enabled.

select?is_read_committed_snapshot_on,

??snapshot_isolation_state_desc,

??????? snapshot_isolation_state

fromsys.databases

where name=‘snapshottest’

go

?

–create a table with each row > 1000 bytes

createtable?t_version(c1 int, c2 char(1000))

go

?

–Load 50 rows. Note,I start the transaction but did not

–commit it yet.

Begin tran

declare @i int

select @i = 0

while (@i 50)

begin

insertinto t_version values (@i,‘hello’)

set @i = @i + 1

end

?

接下來可以通過DMV查看版本存儲區,你會發現顯示版本存儲區行數為0,這是我們實驗的第一個結論,插入(Insert)命令不會產生行版本,因為根本沒有之前的版本可言(有一個特例使插入產生行版本,我們將稍后討論)。這同時意味著批量導入也不會產生行版本。

selectCOUNT(*)fromsys.dm_tran_version_store

— Now commit the transaction

commit

?

接下來讓我們更新表格中的前50行。因為行數據被更新了,SQL Server將復制舊版本進入版本存儲區。所以版本存儲區中將有50行行版本。

— update all the rows in the table

update t_version set c2 =‘test10’

?

— the following statement returns the count of versioned row.

— And, for the case here, it will return 50

selectCOUNT(*)fromsys.dm_tran_version_store

?

請注意,我們沒有使用顯式事務,因此這個Update語句是一個隱式事務,并且是這個隱式事務中唯一的語句。同時沒有并發的事務需要使用行版本,所以這些行版本會被SQL Server當做垃圾數據處理。如果過幾分鐘在運行下面語句,就能發現行版本被回收處理了。

?

— the following statement returns 0 if run after a minute or so

selectCOUNT(*)fromsys.dm_tran_version_store

???????? SQL Server根據事務狀態判斷版本是否不再需要,從而決定垃圾處理該版本。在最差的情況下,如果有一個長事務正在運行,而且這個長事務要么創建了行版本要么需要用到它,那么這個行版本就不能被刪除,版本存儲區就會一直增長甚至會用盡TempDb的空間,就像長事務可以用盡事務日志空間一樣。關于這一點我們會在稍后詳述。

?

和UPDATE操作一樣,如果行被刪除也會創建行版本。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享