SQL Server中TempDB管理(版本儲存區的一個example)
原文來自:
http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/
我們從一個例子開始來了解版本儲存區。本例中資料庫啟用RCSI(使用行版本控制的已提交讀隔離級別)和SI(快照隔離級別)。
當資料庫啟用了RCSI或者SI時,每當行有更新時就會建立一個行版本。此行版本在版本儲存器儲存到不需要為止。那麼SQL Server什麼時候不再儲存這個行版本呢?您可能聯想到一些相關的問題,比如,如果不回收(刪除)行版本會有什麼影響?一次回收一個還是一組行版本?每個使用者表都有不同的結構,那麼SQL Server是不是分別儲存每個表的行版本的?行版本控制的開銷大不大?
首先,我們建立一個資料庫並開啟SI/RCSI
create database snapshottest
go
-- Setting database for snapshot based isolations. AS you can
-- see that enabling SI/RCSI is a simple DDL operation.
alter database snapshottest set read_committed_snapshot ON
go
alter database snapshottest set allow_snapshot_isolation ON
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
from sys.databases
where name='snapshottest'
go
--create a table with each row > 1000 bytes
create table 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
insert into t_version values (@i, 'hello')
set @i = @i + 1
end
接下來可以通過DMV檢視版本儲存區,你會發現顯示版本儲存區行數為0,這是我們實驗的第一個結論,插入(Insert)命令不會產生行版本,因為根本沒有之前的版本可言(有一個特例使插入產生行版本,我們將稍後討論)。這同時意味著批量匯入也不會產生行版本。
select COUNT(*) from sys.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
select COUNT(*) from sys.dm_tran_version_store
請注意,我們沒有使用顯式事務,因此這個Update語句是一個隱式事務,並且是這個隱式事務中唯一的語句。同時沒有併發的事務需要使用行版本,所以這些行版本會被SQL Server當做垃圾資料處理。如果過幾分鐘在執行下面語句,就能發現行版本被回收處理了。
-- the following statement returns 0 if run after a minute or so
select COUNT(*) from sys.dm_tran_version_store
SQL Server根據事務狀態判斷版本是否不再需要,從而決定垃圾處理該版本。在最差的情況下,如果有一個長事務正在執行,而且這個長事務要麼建立了行版本要麼需要用到它,那麼這個行版本就不能被刪除,版本儲存區就會一直增長甚至會用盡TempDb的空間,就像長事務可以用盡事務日誌空間一樣。關於這一點我們會在稍後詳述。
和UPDATE操作一樣,如果行被刪除也會建立行版本。
相關文章
- sql server中的一個坑-len與datalength區別SQLServer
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- 如何在SQL Server中最佳化TempdbSQLServer
- SQL server儲存過程函式SQLServer儲存過程函式
- SQL Server儲存過程的優缺點SQLServer儲存過程
- SQL Server 列儲存索引 第一篇:概述SQLServer索引
- SQL Server中的版本號如何理解SQLServer
- SQL Server新老版本CE區別SQLServer
- 理解SQL Server 2008索引的儲存結構YDSQLServer索引
- SQL SERVER儲存過程AS和GO的含義SQLServer儲存過程Go
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 【SQL Server】常見系統儲存過程SQLServer儲存過程
- Q&A:在SQL Server 2005中編寫儲存過程RVSQLServer儲存過程
- SQL Server 2005的複製儲存過程選項BYSQLServer儲存過程
- SQL Server資料儲存與NTFS簇的大小PXSQLServer
- 關於SQL Server中儲存過程在C#中呼叫的簡單示例SQLServer儲存過程C#
- 如何把SQL Server中一個表,一個儲存過程,一個檢視等改為系統表,系統儲存過程,系統檢視等...SQLServer儲存過程
- SQL Server實戰六:T-SQL、遊標、儲存過程的操作SQLServer儲存過程
- SQL Server 2012新功能巡禮:列儲存索引YXSQLServer索引
- SQL Server 資料訪問策略:儲存過程QCSQLServer儲存過程
- SQL Server 列儲存索引 第三篇:維護SQLServer索引
- SQL Server 列儲存索引 第二篇:設計SQLServer索引
- 使用Spark載入資料到SQL Server列儲存表SparkSQLServer
- SQL Server中count(*)和Count(1)的區別SQLServer
- 資料如何在一個區塊鏈中儲存和保護?區塊鏈
- SQL Server實戰五:儲存過程與觸發器SQLServer儲存過程觸發器
- 阿里雲物件儲存OSS支援版本管理特性阿里物件
- SQL Server 中的一些概念SQLServer
- 區分SQL Server 2008 R2資料中心和並行資料倉儲版本WBSQLServer並行
- 超融合、軟體定義儲存、分散式儲存以及Server SAN的區別與聯絡分散式Server
- Linux 版本的 SQL Server 快速安裝LinuxSQLServer
- 關於SQL server2008除錯儲存過程的完整步驟SQLServer除錯儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- 怎樣評價一個幾千行的 SQL 儲存過程SQL儲存過程
- 儲存管理
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- SQL SERVER 臨時表導致儲存過程重編譯(recompile)的一些探討SQLServer儲存過程編譯Compile
- SQL----儲存引擎SQL儲存引擎
- 使用SQL SERVER儲存過程實現歷史資料遷移SQLServer儲存過程