设为首页 收藏本站
查看: 769|回复: 0

[经验分享] SQL Server中TempDB管理(版本存储区的一个example)

[复制链接]

尚未签到

发表于 2016-11-7 06:21:56 | 显示全部楼层 |阅读模式
原文来自:
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
createdatabasesnapshottest
go

-- Settingdatabaseforsnapshotbased isolations. AS you can
-- see that enabling SI/RCSI is a simple DDL operation.
alterdatabasesnapshottestsetread_committed_snapshotON
go

alterdatabasesnapshottestsetallow_snapshot_isolationON
go

-- check the snapshot state of the database and it will
-- show that both SI and RCSI have been enabled.
selectis_read_committed_snapshot_on,
snapshot_isolation_state_desc,
snapshot_isolation_state
fromsys.databases
wherename='snapshottest'
go

--create a table with each row > 1000 bytes
createtablet_version(c1int,c2char(1000))
go

--Load 50 rows. Note,I start the transaction but did not
--commit it yet.
Begin tran
declare@iint
select@i=0
while(@i<50)
begin
insertintot_versionvalues(@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
updatet_versionsetc2='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操作一样,如果行被删除也会创建行版本。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296671-1-1.html 上篇帖子: SQL去除 下篇帖子: 用SQL SERVER数据库连接RUBY ON RAILS解决乱码问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表