Sql Server Tempdb原理:日志机制解析实践
|
实际并不是tempdb有什么魔法,而是tempdb的日志机制与其他数据库大有不同. Tempdb的日志机制 Tempdb Simple恢复模式(重启后无需还原操作) Tempdb使用最小化日志 Tempdb 不受系统CheckPoint影响(系统checkpoint不涉及tempdb,但人为tempdb中执行会落盘) Tempdb 在刷入数据页到磁盘前,日志无需落盘(事务提交日志无需落盘) "快"的原因 可以看到系统检查点自身会绕过tempdb,tempdb执行时无需日志先落盘.且会最小化日志记录(关于此一个特性我会稍候陈述)这些都极大的缓解了磁盘IO瓶颈,使得tempdb相比其他DB会快很多. 注意:虽然系统checkpoint检查点会绕过tempdb,但tempdb中人为执行checkpoint还是会起作用,大家只应测试环境中使用,正式环境中慎用! 更多精彩内容:http://www.bianceng.cn/database/SQLServer/ 在上面的实例中我们可以看到无论在表的类型是什么,在tempdb中速度都会有很大提升,但普通表的执行时间还是略长于临时表,这是因为普通表的的日志记录信息还是要略多于临时表的. 关于tempdb最小化日志 在堆表(heap)中 insert,update操作的的更新信息日志无需记录. 我们通过简单实例来看.
USE [tempdb]
GO
create table #nclst
(
id int identity(1,1) primary key nonclustered,---heaptable
str1 char(8000)
);
create table #clst
(
id int identity(1,1) primary key,------clustered
str1 char(8000)
);
checkpoint-----生产环境慎用!
DBCC SHRINKFILE (N'templog' , 0, TRUNCATEONLY)
GO
insert into #nclst(str1) select 'aa'
select [Current LSN],Operation,CONTEXT,[Log Record Length]
from fn_dblog(null,null) where AllocUnitId is not null
checkpoint-----生产环境慎用!
DBCC SHRINKFILE (N'templog' , 0, TRUNCATEONLY)
GO
insert into #clst(str1) select 'aa'
select [Current LSN],Operation,CONTEXT,[Log Record Length]
from fn_dblog(null,null) where AllocUnitId is not null
由图1-2中可以看出堆表中并未记录Insert中的#ncls.str1的具体信息,而聚集表中则记录相应信息
图1-2 Tempdb为何需要日志 既然tempdb每次重启都会重新建立,我们无需重做日志,但运行过程中是可能需要回滚的,这也是tempdb日志存在的原因. Tempdb 不支持重做(Redo)但需支持回滚(rollback). 关于tempdb回滚. Tempdb中如果日志文件中无足够空间应用回滚则会引起整个实例就宕机! Tempdb最佳实践-日志 a 不要tempdb中checkpoint(消耗巨大引起系统性能下滑) b 不要tempdb中开启过长事务(无法截断日志,造成日志过大,如回滚时无法回滚则宕机) c 一般需要中间表匹配的过程在tempdb中创建进行(创建速度快,需视具体情况而定.) d tempdb中使用堆表速度佳.(需视具体情况而定) From:cnblogs ShanksGao (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


