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.microsoft.com/technet/prodtechnol/sql/2005/workingwithtempdb.mspx

Ø  TempDB基础

TempDB和其他用户数据库一样以Model数据库为模板创建,并且可以创建和查询表格。与其他用户数据库不同的是,TempDB在每次SQL Server启动的时候都会被重新创建。这就意味着:

l  TempDB不需要恢复。因此它不必使用全备份或者大容量日志记录恢复模型。事实上,TempDB是配置成简单恢复模型并且不能改变的。

l  虽然TempDB不需要被恢复,但不是说TempDB上的操作没有日志记录。SQL Server中每个操作都是在显式或隐式(每个语句都是一个独立的事务)的事务中完成,这个事务也包含了在TempDB对象上的操作。如果更新全局临时表中的行然后回滚事务,是无法撤销此更改的,除非我们记录了更新之前的值。不过,也没有必要记录更新后的值,因为只有数据库恢复过程中需要重做事务时这个值才有用。像我之前提到的一样,TempDB是不需要恢复的,于是没有理由记录更新后的值。再举一个例子让我们看看插入操作。在一个全局临时表中的插入一行,实际值不会被记录。因为SQL
Server不需要这个行值来完成撤消操作,仅仅需要适当地设置页面中的偏移量,或者这个插入造成页面被分配或者取消分配。总结起来,我们只需要记录可能被撤销的信息而不需要记录可能被重做的信息。这一点关于日志记录文件的变化是由SQLServer 2005开始的。更复杂的情况是,并不是TempDB中所有对象都被日志文件记录。后文会详细叙述。现在我们来看一个例子说明这一点

use tempdb

go

 

---------------

-- SETUP

---------------

drop table ##t_tempdblog

go

 

-- create a global temp table. Notice, each row is

-- greater than > 1000. I did this so that we can easily

-- identify if the row is indeed logged.

create table ##t_tempdblog (c1 int, c2 char(1000))

go

 

-- load 10 rows into this table

declare @i int

select @i = 0

while (@i < 10)

begin

    insert into ##t_tempdblog values

          (@i, replicate (cast ('a' as varchar), 1000))

select @i = @i+1

end

 

--Now run the following command to see the log records

select top 10 operation,context,

      [log record fixed length],

      [log record length]

from fn_dblog(null, null)

where allocunitname='dbo.##t_tempdblog'

order by [Log Record Length] Desc

这是上述查询的输出。您将注意到的所有日志记录都 < 100 字节,显然插入的行没有被记录。

operation       context    log record fixed length    log record length

-----------------------------------------------------------------------

LOP_MODIFY_ROW  LCX_IAM            62                      88

LOP_MODIFY_ROW  LCX_IAM            62                      88

LOP_FORMAT_PAGE LCX_HEAP           80                      84

LOP_FORMAT_PAGE LCX_IAM            80                      84

LOP_FORMAT_PAGE LCX_HEAP           80                      84

LOP_MODIFY_ROW  LCX_PFS            62                      80

LOP_MODIFY_ROW  LCX_PFS            62                      80

LOP_INSERT_ROWS LCX_HEAP           62                      72

LOP_INSERT_ROWS LCX_HEAP           62                      72

LOP_INSERT_ROWS LCX_HEAP           62                      72

于是,这就证明了TempDB的日志和其他用户数据库不同。将上面同样的例子操作应用于用户数据库,日志记录会成为这个样子:

operation             context   log record fixed length log record length

----------------------------------------------------------------------

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1101

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

这就证明了,撤销确实会被日志记录。实验时做了以下操作:

  update ##t_tempdblog set c2 =

            replicate (cast ('b' as varchar), 1000)

之后,做这样的查询:

select top 10 operation,context,

       [log record fixed length], [log record length]

from fn_dblog(null, null)

where allocunitname='dbo.##t_tempdblog'

order by [Log Record Length] Desc

以下是输出内容,你会发现日志的长度超过1000字节,事实上列C2更新之前的值被记录了。

operation          context    log record fixed length log record length

-----------------------------------------------------------------------

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

时间: 2024-11-08 23:22:12

SQL Server中tempdb的管理的相关文章

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 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中TempDB管理(version store的逻辑结构)

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

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

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

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

SQL Server 中的事务(含义,属性,管理)

含义: 事务要有非常明确的开始和结束点,SQL Server 中的每一条数据操作语句,例如SELECT.INSERT.UPDATE和DELETE都是隐式事务的一部分.即使只有一条语句,系统也会把这条语句当做一个事务,要么执行所有的语句,要么什么都不执行. 事务开始之后,事务所有的操作都会写到事务日志中,写到日志中的事务,一般有两种:一是针对数据的操作,例如插入.修改和删除,这些操作的对象是大量的数据;另一种是针对任务的操作,例如创建索引.当取消这些事务操作时,系统自动执行这些操作的反操作,保证系

《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中数据文件空间使用与管理 1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以后,引入了分区表的概念(Table Partition),在存储组织上,现有的分区基本上替代了原来表格的概念,原先表的概念成为了一个逻辑概念.一个分区就是一个B树或者一个堆.而一张表格则是一个

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE