SQL Server中TempDB管理(版本存储区的一个example)

原文:SQL Server中TempDB管理(版本存储区的一个example)

原文来自:

http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/31/managing-tempdb-in-sql-server-tempdb-basics-version-store-simple-example.aspx

我们从一个例子开始来了解版本存储区。本例中数据库启用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操作一样,如果行被删除也会创建行版本。

 

时间: 2024-08-02 16:08:40

SQL Server中TempDB管理(版本存储区的一个example)的相关文章

SQL Server中TempDB管理(版本存储区的一个example)

我们从一个例子开始来了解版本存储区.本例中数据库启用RCSI(使用行http://www.aliyun.com/zixun/aggregation/9591.html">版本控制的已提交读隔离级别)和SI(快照隔离级别). 当数据库启用了RCSI或者SI时,每当行有更新时 就会创建一个行版本.此行版本在版本存储器保存到不需要为止. 那么SQL Server什么时候不再保存这个行版本呢?您可能联想到一些相关的问题,比如,如果不回收(删除)行版本会有什么影响?一次回收一个还是一组行版本?每 个

SQL Server中TempDB管理(version store的逻辑结构)

原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/31/managing-tempdb-in-sql-server-tempdb-basics-version-store-logical-s

SQL Server中TempDB管理(version store的逻辑结构)

前面几篇博文已经初步介绍了版本存储区,现在我们来了解一下它的逻辑结构,看看它究竟是如何储存不同结构的表格和索引行的.其实我们只要看一下DMVsys.dm_tran_version_store这个DMV就够了. 这个DVM视图显示了版本存储区全部逻辑结构.有两点值得注意.第一,版本存储区也和数据页面索引页面一样由8k大小的页组成.这些页存在缓冲池中,可以在TempDB面临内存压力时被写入磁盘.第二,版本存储区存储的是完整的二进制文件,就像在数据页存储的一样.这种二进制文件分为前后两个部分,然后在S

SQL Server中tempdb的管理

原文:SQL Server中tempdb的管理  资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/21/tempdb-basics.aspx 我们推出了一系列的关于TempDB基础,监控和问题调试的博文,也建议大家阅读有开发和测试部门给出的白皮书http://www.mic

SQL Server中Tempdb initial size和dbcc shrinkfile的使用说明

在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立刻释放tempdb文件所占用的空间,这时你会有两个选择: 重启SQL Server.大家都知道SQL Server重启时会创建一个新的tempdb.由于tempdb的initial size并不会随着文件大小的增长而增长,重启SQL Server就会创建一个新的3MB的tempdb. 使用DBCC命

SQL Server 中时间数据查询需要注意的一个小问题

server|数据|问题 由于本人的工作环境,接触到基于不同语言下的SQL Server,遇到不少麻烦,其中DateTime数据类最多,中文,韩文等数据库中时间的默认格式为:MM/DD/YY 或 YY/MM/DD但英文中又分为:MM/DD/YY 或 DD/MM/YY 这样问题就来啦例如: 我的一个韩国客户,操作系统:windows 2000 server 英文版,MS SQL Server 韩文版他的主机在新西兰,时间系统默认为新西兰 DD/MM/YY数据库时间默认为:  MM/DD/YY当数据

用VB存取SQL Server中的图像数据

本文介绍MIS SQL Server对图像数据的存储机制和存取方法.针对VB开发工具,介绍了一种通过ADO Field 对象的GetChunk 方法和AppendChunk 方法来存取MIS SQL Server中的图像数据的方法. 在一个完善的医院信息MIS中,图像数据的存取是必不可少的,比如X光片.CT像片的保存.一方面,这些图像数据在远程诊疗为准确诊断病情提供了重要的依据,另一方面,也为快速查阅病人资料提供了基本条件.图像数据的存取在其它应用系统如GIS中也有广泛的应用. 1.SQL Se

[Python]Python/PHP如何查询sql server中NTEXT类型数据

[Python]Python/PHP如何查询sql server中NTEXT类型数据 Version Date Creator Description 1.0.0.1 2006-11-23 郑昀 草稿   继续阅读之前,我们假设您熟悉以下知识: n         Python / PHP n         SQL Server 2000 SP4以上版本的Microsoft sql server n         pymssql n         NTEXT类型 本文讨论了在Python中

SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)

原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/22/managing-tempdb-in-sql-server-tempdb-basics-verison-store.as