《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结

Tempdb系统数据库是一个全局资源。可供连接到SQL Server实例的全部用户使用。

存储的内容项:

1、用户对象

用户对象由用户显示创建。这些对象能够位于用户会话的作用域中。也能够位于创建对象所用例程的作用域中。

例程能够是存储过程、触发器或用户自己定义函数。

用户对象能够是一下项内容之中的一个:

  • 用户定义的表和索引
  • 系统表和索引
  • 全局暂时表和索引
  • table变量
  • 表值函数中返回的表

2、内部对象

内部对象是依据须要由SQL Server数据库引擎创建的,用户处理SQL Server语句。

内部对象能够在语句的作用域中创建和删除。内部对象能够是下列项之中的一个:

  • 用于游标或假脱机操作以及暂时大型对象(LOB)存储的工作表
  • 用于哈希连接或哈希聚合操作的工作文件
  • 用于创建或又一次生成索引等操作(假设指定了SORT_IN_TEMPDB)的中间排序结果,或者某些GROUP BY、ORDER BY或UNION查询的中间排序结果。
  • 每一个对象至少使用9页:一个IAM页。一个8页的区。

3、版本号存储区

版本号存储区是数据页的集合,它包括支持使用行版本号控制的功能所需的数据行。主要用来支持快照(Snaphot)事务隔离级别,以及SQL Server2005推出的一些其他提高并法度的新功能。在SQL Server2005中,有两个版本号存储区:公用版本号存储区和索引生产版本号区。包括下面内容:

  • 由使用快照隔离界别或已提交读隔离界别(基于行版本号控制)的数据库中的数据改动事务生成的行版本号
  • 由数据改动事务为实现联机索引操作、多个活动的结果集(MARS)以及AFTER触发器等功能而生成行版本号

在SQL Server2005以后,tempdb须要的磁盘空间会多于早期版本号。因此当升级到SQL Server2005或SQL Server2008后。管理员提供的tempdb磁盘空间可能得比曾经要大一些,用以容纳当前生产工作负荷并满足使用tempdb的SQL Server功能的额外空间要求。

Tempdb空间使用跟踪

tempdb空间使用的一大特点,是仅仅有一部分对象,比方:暂时表、table 变量等。能够用sys.allcoation_units和sys.partitions这种管理视图来管理。所以用sp_spaceused的结果和真实情况会有非常大差异。

提示:tempdb的空间使用是不能用sp_spaceused来跟踪的。

DBCC SHOWFILESTATS还是能够反映数据库文件使用的总体情况的。

在2005版本号以后引入了一个新的视图:sys.dm_db_file_space_usage;这张视图能反映出tempdb在例如以下几个大类的空间里使用分布:

select * from sys.dm_db_file_space_usage

当中:

database_id:数据库ID

file_id:文件ID,file_id映射到sys.dm_io_virtual_file_stats中的file_id,而且映射到sys.sysfile中的fileid

unallocated_extent_page_count:文件未分配区中的总页数。不包括已分配区中的未使用页

version_store_reserved_page_count:为版本号存储分配的统一区中的总页数

user_object_reserved_page_count:为从统一区为数据库中的用户对象分配的总页数。计数中包含已分配区中未使用的页。

能够使用sys.allocation_units文件夹视图中的total_pages列来返回用户对象每一个分配单元保留的页计数

internale_object_reserved_page_count:从统一区为文件里的内部对象分配的总页数。

计数包含已分配区中未使用的页

mixed_extent_page_count:文件的已分配混合区中的已分配和未分配总页数。混合区包括分配给不同对象的页。此计数器包括文件里的全部的IAM页

通过这个表的监视。就能知道temdb的空间被那个一块对象使用掉了,是用户对象(user_object_reserved_page_count),还是系统对象(internal_object_reserved_page_count),还是版本号存储区对象(version_store_reserved_page_count)。

tempdb在生产环境中的设置的初始大小事实上是一个经验值,也就是说没有一个好的固定值,可是我们能够依据工作负荷来确定该值的大小值:

1、设置tempdb的自己主动增长

2、模拟各个单独的查询或工作任务,同一时候监视tempdb空间使用

3、模拟运行一些系统维护操作。比如,又一次生成索引,同一时候监视tempdb空间

4、使用前面2和3步中tempdb空间使用值来预測总的工作负荷下,会使用多少空间;并针对计划的并发度调整此值。比如,假设一个任务会使用10GB的tempdba空间,而在生产环境里。最多可能会有4个这种任务同一时候执行,那就要至少预留40GB的空间。

5、设置tempdb在生产环境下的初始大小。

同一时候也開始自己主动增长。

Temp文件个数以及大小设置。不但满足用户任务的需求。还要考虑到性能优化。

我们利用脚本来跟踪一下,看看是什么样的操作导致了SQL Server要这样大规模的使用tempdb,然后分析一下是正常行为还是异常行为,监视SQL Server的行为当然能够利用SQL Trace来完毕。但是管理员并不能预期造成大量使用tempdb的语句会在什么时刻执行。这些语句可能一周仅仅做一次。

并且开跟踪毕竟对SQL Server来讲是一个比較昂贵的事情,就算没有性能副作用,假设一直开着SQL Trace,也会产生大量的跟踪文件,对硬盘是个比較重的负担。

推荐的“轻量级”的操作是以一定的时间间隔执行可以监视系统执行状况的DBCC命令、查询管理视图(DMV)以及管理函数(DMF)等。把这个结果输出到一个文件中。

新开一个连接,我们输入下面常规脚本:

select @@SPID
go
use AdventureWorks
go
select GETDATE()
go
select * into #MyOrdersDetail
from Sales.SalesOrderDetail
--创建一个暂时表
--这个操作应该会申请用户对象页面
go
waitfor delay ‘0:0:2‘
select GETDATE()
go
drop table #MyOrdersDetail
--删除一个暂时表
--这个操作用户对象页面数量应该会下降
go
waitfor delay ‘0:0:2‘
select GETDATE()
go
select top 100000 * from
[Sales].[SalesOrderDetail]
inner join [Sales].[SalesOrderHeader]
on [Sales].[SalesOrderHeader].[SalesOrderID] =
[Sales] .[SalesOrderHeader].SalesOrderID;
--这里做了一个比較大的连接。应该会有系统对象申请
go
select GETDATE()
--join 语句做完以后系统对象页面数目应该会下降
go

然后另开一个窗体,我们输入监控脚本。输出结果以文本方式存储

use tempdb
--每隔1s执行一次。直到用户手工终止脚本执行
while 1=1
begin
select GETDATE()
--从文件级看temp使用情况
dbcc showfilestats
--第一个会话
--返回全部做过空间申请的会话信息
select ‘Tempdb‘ as DB,GETDATE() as Time,
sum(user_object_reserved_page_count)*8 as user_obectskb,
SUM(internal_object_reserved_page_count)*8 as internal_objects_kb,
SUM(version_store_reserved_page_count)*8 as version_store_kb,
SUM(unallocated_extent_page_count)*8 as freespace_kb
from sys.dm_db_file_space_usage
where database_id=2

--第二个会话
--这个管理视图可以反映当时tempdb空间的整体分配
select t1.session_id,
t1.internal_objects_alloc_page_count,
t1.user_objects_alloc_page_count,
t1.internal_objects_dealloc_page_count,
t1.user_objects_dealloc_page_count,
t3.*
from sys.dm_db_session_space_usage t1,
--反映每一个会话累计空间申请
sys.dm_exec_sessions as t3
--每一个会话信息
where
t1.session_id=t3.session_id
and (t1.internal_objects_alloc_page_count+t1.internal_objects_dealloc_page_count+t1.user_objects_alloc_page_count+t1.user_objects_dealloc_page_count)>0

--第三会话
--返回正在执行而且做过空间申请的会话正在执行的语句
select t1.session_id,
st.text
from sys.dm_db_session_space_usage as t1,
sys.dm_exec_requests as t4
cross apply sys.dm_exec_sql_text(t4.sql_handle) as st
where t1.session_id=t4.session_id
and t1.session_id>50
and (t1.internal_objects_alloc_page_count+t1.internal_objects_dealloc_page_count+t1.user_objects_alloc_page_count+t1.user_objects_dealloc_page_count)>0

waitfor delay ‘0:0:1‘
end

我们先执行监控,然后再执行一般脚本,能够分析一下跟踪结果。

能够看到在新建暂时表的时候,对于Tempdb的申请空间有所添加。 四川www.sczygb.com/

时间: 2024-10-28 10:20:15

《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结的相关文章

《Microsoft SQL Server企业级平台管理实践》笔记

- 页是 SQL Server 中数据存储的基本单位,大小为 8KB. - 区是空间管理的基本单位,8个物理上连续的页的集合(64KB). - 页的类型包括: 1. Data 2. Index 3. Text/Image 4. Global Allocation Map 5. Shared Global Allocation Map 6. Page Free Space, Index Allocation Map 7. Bulk Changed Map 8. Differential Chang

《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server如何设置自动增长和自动收缩项 SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置.通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发生.一般来讲,如果数据库不是很忙,默认的设置为自动增长,这种方式能够满足大部分的需求.但是在大量并发的情况下,申请数据文件和日志文件增长本身是一件非常消耗系统资源和影响性能的工作.所以如果

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

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

《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server数据库文件分配方式 1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL Server存储在一些系统视图里的空间使用统计信息计算出的结果,如果没有更新空间统计信息,比如刚刚发生大数据插入,sp_spaceused的结果就不准确.3.这个命令主要是针对普通用户的数据库,对

《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复

原文:<SQL Server企业级平台管理实践>读书笔记--几个系统库的备份与恢复 master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记录着启动服务器实例所需要的初始化信息,每个其它数据库的主文件位置.master数据库是SQL Server启动的时候打开的第一个数据库.SQL Server是从这个数据库里找到其它数据的信息的.如果master数据

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

1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以后,引入了分区表的概念(Table Partition),在存储组织上,现有的分区基本上替代了原来表格的概念,原先表的概念成为了一个逻辑概念.一个分区就是一个B树或者一个堆.而一张表格则是一个到多个分区的组合. 1.1用B树存储于聚集索引的表数据页 如果一个表格上有聚集索引(Clustered In

《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式

数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍SQL Server备份原则,SQL Server数据库分为数据文件和日志文件.为了使得数据库能够恢复一致点,备份不仅需要拷贝数据数据文件里的内容,还要拷贝日志文件里的内容.那么根据每次备份的目标不同,我们可以将备份分为数据备份和日志备份. 数据备份的范围可以是完整的数据库.部分数据库.一组文件或文件组.所以根据备份下来的数据文件的范围,又分为了完整数据库备份.文件备份和部分备份. 完整数据库备份 完整数据库备份

《SQL Server企业级平台管理实践》读书笔记——当我们的备份都已经损坏的时候该怎么办

作为数据库管理员最最痛苦的莫过于,当数据库宕机的时候需要找备份,但在这个时候突然发现备份文件也是坏的,这就意味着数据会丢失,为此可能会丢掉职位,饭碗不保,所以为此,我们一定要保证好备份的完整性,一般发生这种情况的原因莫过于一下几种: 1.备份文件和数据库放在同一个(或一组)的物理磁盘上.磁盘出现故障,备份也保不住了. 2.备份介质随坏,或者做的是网络备份,数据在网络传输中发生了损坏. 3.数据库在做完整备份.文件备份或者文件组备份的时候,里面的内容就已经有了随坏. 所以基于此,我们要避免的就是以

jQuery内核详解与实践读书笔记1:原型技术分解2

上一篇已经搭建了一个非常简陋的jQuery框架雏形,如没有阅读搭建过程,请先阅读<jQuery内核详解与实践读书笔记1:原型技术分解1>初始搭建过程.接下来,完成书中介绍的剩下三个步骤: 7. 延续--功能扩展 jQuery框架是通过extend()函数来扩展功能的,extend()函数的功能实现起来也很简单,它只是吧指定对象的方法复制给jQuery对象或jQuery.prototype对象,如下示例代码就为jQuery类和原型定义了一个扩展功能的函数extend(). 1 var $ = j