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

我们从一个例子开始来了解版本存储区。本例中数据库启用RCSI(使用行">版本控制的已提交读隔离级别)和SI(快照隔离级别)。

当数据库启用了RCSI或者SI时,每当行有更新时
就会创建一个行版本。此行版本在版本存储器保存到不需要为止。
那么SQL Server什么时候不再保存这个行版本呢?您可能联想到一些相关的问题,比如,如果不回收(删除)行版本会有什么影响?一次回收一个还是一组行版本?每
个用户表
都有不同的结构,那么
SQL Server是不是分别存储每个表的行版本的?行版本控制的开销大不大?
首先,我们创建一个数据库并开启SI/RCSIcreatedatabasesnapshottestgo -- Setting databaseforsnapshot based isolations. AS you can-- see that enabling SI/RCSI is a simple DDL operation.alterdatabase snapshottest setread_committed_snapshotONgo alterdatabase snapshottest setallow_snapshot_isolationONgo -- 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.databaseswhere name='snapshottest'go --create a table with
each row > 1000 bytescreatetable t_version(c1 int, c2 char(1000))go --Load 50 rows. Note,I start the transaction but did not--commit it yet.Begin trandeclare @i intselect @i = 0while (@i < 50)begininsertinto t_version values (@i,'hello')set @i = @i + 1end 接下来可以通过DMV查看版本存储区,你会发现显示版本存储区行数为0,这是我们实验的第一个结论,
插入(Insert)命令不会产生行版本,因为根本没有之前的版本可言(有一个特例使插入产生行版本,我们将稍后讨论)。这同时意味着批量导入也不会产生行版本。selectCOUNT(*)fromsys.dm_tran_version_store-- Now commit the transactioncommit 接下来让我们更新表格中的前50行。因为行数据被更新了,SQL Server将复制旧版本进入版本存储区。
所以版本存储区中将有50行行版本。-- update all the rows in the tableupdate t_version set c2 ='test10' -- the following statement returns the count of versioned row. -- And, for the case here, it will return 50selectCOUNT(*)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操作一样,如果行被删除也会创建行版本。

时间: 2024-10-02 02:36:05

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

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-examp

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