SQL Server数据库空间管理 (1)

数据库经常遇到的问题:

1)、数据库文件空间用尽  2)、日志文件不停增长 3)、数据库文件无法收缩  4)、自动增长和自动收缩

本系列就以上面的4个问题入手分析并总结数据库空间的管理方法。

  1、文件的分配方式以及文件空间检查方法

首先,你在你的数据库中运行sp_spaceused;之后会看到当前数据库的使用空间信息;这个命令也就会将大概的数据库空间信息给你展现出来,并不能查看每个数据文件和日志文件的使用情况;其中对于数据库tempdb来说里面存储的临时数据对象,这个命令是统计不到的。我们知道数据库分为主文件(.mdf)和辅助文件(.ndf);数据的存放按照页和区来存放和管理的,这里有一条命令可以查看具体的页内容:DBCC PAGE (<db id >,<file id >,<page id>,<format id>)我们来运行这个命令前打开跟踪标志(trace flag):

上图使用参数为3的命令,下面我们设置参数为2:看看输出的信息,里面的信息结合Sql Server专题一:索引(上)的内容便可理解,下面的内容其实就将222的数据页内的内容给展现出来了;补充(与下文无关):SQL Server会将总长超过8K的的数据页分开存放,单独放在行溢出(Row-Overflow)页中.

PAGE: (1:222)
BUFFER:
BUF @0x00000001F07A2F40
bpage = 0x00000001E1068000          bhash = 0x0000000000000000          bpageno = (1:222)
bdbid = 5                           breferences = 0                     bcputicks = 0
bsampleCount = 0                    bUse1 = 7102                        bstat = 0x9
blog = 0x2121215a                   bnext = 0x0000000000000000          

PAGE HEADER:
Page @0x00000001E1068000
m_pageId = (1:222)                  m_headerVersion = 1                 m_type = 2
m_typeFlagBits = 0x0                m_level = 0                         m_flagBits = 0x200
m_objId (AllocUnitId.idObj) = 34    m_indexId (AllocUnitId.idInd) = 2   Metadata: AllocUnitId = 562949955649536
Metadata: PartitionId = 562949955649536                                  Metadata: IndexId = 2
Metadata: ObjectId = 34             m_prevPage = (1:221)                m_nextPage = (1:223)
pminlen = 10                        m_slotCnt = 137                     m_freeCnt = 38
m_freeData = 7880                   m_reservedCnt = 0                   m_lsn = (33:400:6)
m_xactReserved = 0                  m_xdesId = (0:0)                    m_ghostRecCnt = 0
m_tornBits = -639233702             DB Frag ID = 1                      

Allocation Status

GAM (1:2) = ALLOCATED               SGAM (1:3) = NOT ALLOCATED          PFS (1:1) = 0x40 ALLOCATED   0_PCT_FULL
DIFF (1:6) = CHANGED                ML (1:7) = NOT MIN_LOGGED           

DATA:

Memory Dump @0x000000000F89A000

000000000F89A000:   01020000 00020200 dd000000 01000a00 df000000  ....................
000000000F89A014:   01008900 22000000 2600c81e de000000 01000000
省略  ............
000000000F89BFF4:   90015c01 1001be00 86006000                    ..\.......`.

OFFSET TABLE:

Row - Offset
136 (0x88) - 7826 (0x1e92)
135 (0x87) - 7792 (0x1e70)
134 (0x86) - 7720 (0x1e28)
133 (0x85) - 7636 (0x1dd4)
125 (0x7d) - 7174 (0x1c06)
118 (0x76) - 6802 (0x1a92)
省略  ............
5 (0x5) - 400 (0x190)
4 (0x4) - 348 (0x15c)
3 (0x3) - 272 (0x110)
2 (0x2) - 190 (0xbe)
1 (0x1) - 134 (0x86)
0 (0x0) - 96 (0x60)                 

DBCC 执行完毕。

另一种查看数据库的方法是:在Mangement Studio中选择数据,右键-->报表-->标准报表中查看:这两种统计的方法是不同的;这里是按照区来统计的;上面的sp_spaceused使用的是页统计方法;报表这种方法内部是调用了DBCC SHOWFILESTATS命令,这个命令直接从GAM和SGAM这样的系统分配页面上读取区的分配信息,直接算出数据库文件里面有多少区被分配了;因为SQL Server绝大多数是按照区为单位来分配新的空间的,而系统分配页上的信息是实时更新的,所以这个统计方法比较可靠;在服务器负载很高的情况下也可以执行;所以不推荐sp_spaceused的方法,这种方法还不如查看系统试图(sys.dm_db_partition_stats);

其实还有一种查看数据空间的方法:DBCC SHOWCONTIG(或者 sys.dm_db_index_physical_stats)这个命令可以统计出你的某张表或者索引用了多少页面、多少区、甚至页面的平均数据量。从这些值你可以算出一张表格占用了多少空间。这个命令的代价恨到,SQL Server会扫描数据库,而扫描的过程是要加锁的;例如sys.dm_db_index_physical_stats就有三种扫描方式。越精确扫描越久。1:LIMITED   2 : SAMPLED  3 : DETAILED这3中方式扫描时间依次增加; 下面为DBCC SHOWCONTIG的统计信息。这种信息对于统计区的使用情况、碎片程度展现比较好。

DBCC SHOWCONTIG 正在扫描 ‘DimAccount‘ 表...
表: ‘DimAccount‘ (5575058);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 2
- 扫描区数..............................: 1
- 区切换次数..............................: 0
- 每个区的平均页数........................: 2.0
- 扫描密度 [最佳计数:实际计数].......: 100.00% [1:1]
- 逻辑扫描碎片 ..................: 50.00%
- 区扫描碎片 ..................: 0.00%
- 每页的平均可用字节数.....................: 2695.0
- 平均页密度(满).....................: 66.70%
DBCC SHOWCONTIG 正在扫描 ‘DimCurrency‘ 表...
表: ‘DimCurrency‘ (21575115);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1
- 扫描区数..............................: 1
- 区切换次数..............................: 0
- 每个区的平均页数........................: 1.0
- 扫描密度 [最佳计数:实际计数].......: 100.00% [1:1]
- 逻辑扫描碎片 ..................: 0.00%
- 区扫描碎片 ..................: 0.00%
- 每页的平均可用字节数.....................: 3147.0
- 平均页密度(满).....................: 61.12%
DBCC SHOWCONTIG 正在扫描 ‘DimCustomer‘ 表...
表: ‘DimCustomer‘ (37575172);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1569
- 扫描区数..............................: 197
- 区切换次数..............................: 1238
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 15.90% [197:1239]
- 逻辑扫描碎片 ..................: 75.27%
- 区扫描碎片 ..................: 3.05%
- 每页的平均可用字节数.....................: 3037.7
- 平均页密度(满).....................: 62.47%
  省略……
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

附加:日志文件 

我们知道日志文件不是按照页、区来分配和管理的。SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志单元。虚拟日志单元没有固定大小,并且一个物理日志文件所包含的虚拟日志单元数十部固定的。管理员不能配置或设置虚拟日志单元的大小或数量。但 SQL Server 会尝试控制虚拟日志单元的数目,把它限制在一个合理的范围里。例外情况是,日志文件每字段增长一次,会至少增加一个虚拟日志单元。所以,如果一个日志文件经历了多次自动增长,里面的虚拟日志单元数目会比正常的日志文件多很多,这种情况会影响日志文件管理的效率,以至于影响SQL Server 的启动。事务日志是一种回绕的文件。另外,这里有一篇专门介绍SQL Server的日志的博客。下图为事务日志的工作方式;

2、空间监测实例

待续……通过脚本监视tempdb空间

时间: 2024-10-25 08:18:37

SQL Server数据库空间管理 (1)的相关文章

SQL Server数据库空间管理 (2)

本篇内容主要解决剩余的两个问题:2).日志文件不停增长  4).自动增长和自动收缩 日志文件不停增长……

sql server 数据库的管理以及维护

   http://xiaorenwutest.blog.51cto.com                 数据库和表的管理 前言:上次主要介绍的是sql server数据库的搭建以及通过SSMS工具进行连接数据库,本次内容主要介绍数据库的表进行管理.在工作中DBA通常对数据库进行创建和删除以及修改表的内容,扩展和收缩.分离及附加. 表是存放数据.查找数据以及更新数据的基本数据构建,在对数据的操作都是在表的基础上进行的,以及如何维护表.   注:实际上表是逻辑的存在,事实上数据存放在硬盘上面.

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

数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍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数据库的在server 2008R2上的安装及基本管理

         SQL server数据库的在server 2008R2上的安装及基本管理(一) 选择SQL的数据库的镜像文件 双击setup.ext 执行安装程序 这里选择安装项,并选择全新安装 安装的环境监测全部通过 因为这里是使用的破解版的镜像,所以会自动生成密钥 再一次检测安装环境 这里选择第一项 这里选择全部的功能 这里选择默认的实例名 这里将系统的内置账户添加到服务中,NT 这里选择混合式身份 验证,并输入sa的密码.并添加本地的管理员 这里添加本地的管理员账户 选择第一项 开始安

视图模式及T-SQL语句操作管理SQL Server数据库

关于SQL Server数据库相关理论概念请参考:SQL Server数据库.表.数据类型基本概念 一.视图模式管理表 SQL Server对数据库的操作有两种方式,即可视化操作界面和SQL语言.下面介绍在SSMS可视化界面中,使用鼠标.键盘轻松快捷地实现表结构的创建.修改和删除操作,以及对表中数据执行添加.修改.删除操作. 1.创建表 1)打开SSMS,然后展开数据库class,右击"表"节点,在弹出的快捷菜单中选择"新建"-->"表"命

关于SQL SERVER数据库学习总结

对于SQL SERFVER数据库也学了有一阵子了,自己也对自己所学做了一些总结. 我们首先学习数据库设计的一些知识点和用SQL语句建库. 设计数据库步骤:需求分析阶段,概要设计阶段,详细设计阶段, 建数据库的SQL语句如下(包含了如果有该数据库先删除在建立数据库) use masterGOif exists(select * from sysdatabases where name='Wages')DROP database WagesCREATE DATABASE Wages ON (  NA

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用