SQL Server dbcc shrinkfile 不起作用
方法 1、重建聚集索引。
方法 2、重建堆表。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
原理说明。dbcc shrinkfile 的操作单位是区(extent 也有的书上说成是扩展),数据存在数据页中,8 个数据页的集合叫做一个区(extent)。
区有统一区和混合区之分。如果一个对象所占的空间大于 8 个页面(一个页面在大小是8KB,所以说一个区的大小是64KB)对象的空间分配都
要以区为单位(就是说每一次分配最少给它64KB),如果对象小于64KB,每次的空间分配都以页为单位(就是说一次给它 8KB的空间)。
例子、
create table T(X int ,String nvarchar(4000));
go -- 这个表的第一行都接近8KB 所以一个页面只可以存一行。
declare @i as int =1;
while @i <=1000
begin
insert into T(X,String) values
(1,replicate(N'A',4000)),
(2,replicate(N'A',4000)),
(3,replicate(N'A',4000)),
(4,replicate(N'A',4000)),
(5,replicate(N'A',4000)),
(6,replicate(N'A',4000)),
(7,replicate(N'A',4000)),
(8,replicate(N'A',4000));
set @i = @i +1;
end
go -- 向表中插入8000行数据。
数据的页面如下、
dbcc showcontig('T');

可以看到T这个表有8000面
这时我们来做一件事,就是用delete 命令删除表中数据的 7/8;代码如下。
delete from T
where T.X != 1;
这样就只留下了X = 1 的行。它要占的空间是1000个页面、可是事实真的是主样吗?我们用dbcc showcontig('T')看一下
dbcc showcontig('T');

可以看到它还是占着4124个页面不是我们想的1000个页面。因为表T是一个堆表,它内部的数据是无序的也就是说不是 1、2、3、4、5、6、7、8
这种方式存的。内部的区可能是这样的

话说回来,如果表T 它是有序的呢? 前1000个页面存的会是 1、也就是说后面的7000个页面不会出现1。堆表是无序的每个页面都可能
出现 1。
重点:
问题的重点来了,dbcc shrinkfile 的操作对象是区、也就是说只有空的区才可以被shrinkfile回收、刚才的dbcc shrinkfile('T') 的返回可以看出有4124个页面
存在,说明500(4123/8)多个区中保存着 1 的数据、所以它没有被回收。如果聚集表后面7000个页面所在的区都会被回收。因为这些区都是空的。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
方法 1、:
重建堆表。
alter table T rebuild;
go

可以看到页面的占用由4123页变回了1001页。
方法 2、
加聚集索引
create clustered index idx_X
on T(X);
go

可以看到加聚集索引也可以达到一样的效果。
总结:DBA 要定期对表进行管理以减少它的碎片化程度,减少select 时的IO量,提高select 的速度。事实上聚集索引对insert 可以说基本上没有太
大的影响。对select ,update ,delete 的好处是大大的。本例可以看到它对空间的占用也是有利的。
所以、对表加一个聚集索引还是相当不错的。
SQL Server dbcc shrinkfile 不起作用的更多相关文章
- [转帖]SQL Server DBCC命令大全
SQL Server DBCC命令大全 原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPC ...
- 再谈SQL Server中日志的的作用
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server ...
- SQL Server DBCC命令大全
原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPCLEANBUFFERS:从缓冲池中删除所有缓 ...
- SQL Server 中日志的的作用(Redo和Undo)
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...
- SQL Server创建视图——视图的作用
视图简介: 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口. 常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 . ...
- SQL Server 2012 Express LocalDB 的作用
微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio ...
- SQL server 2005中无法新建作用(Job)的问题
1.在使用sqlserver2005创建作业时,创建不了,提示 无法将类型为“Microsoft.SqlServer.Management.Smo.SimpleObjectKey”的对象强制转换为类型 ...
- SQL Server dbcc checkdb 做了什么。
第一步: 读取系统元数据.读完这些数据后dbcc checkdb 就知道自己要检测的是一个怎样的数据库了.如果在这一步就出错了.dbcc 就直接出错 了.不会再运行下去. 第二步: 在dbcc che ...
- SQL Server dbcc checkdb 修复
默认dbcc checkdb 只做数据库的检测数据库是否完好.不会主动做数据库的修复,要修复数据库,需要数据库设单用模式. 1.repair_allow_data_loss 可能导致数据丢失. 2. ...
随机推荐
- LFS,编译自己的Linux系统 - 完成准备工作
$LFS 确保环境变量$LFS已被定义. 定义:export LFS=/mnt/lfs 检查:echo $LFS 建立目录 $LFS/tools $LFS/tools目录用于存放和编译一些临时使用的工 ...
- Taglib、EL、OGNL
Taglib.EL.OGNL 阅读目录 1. Taglib(tag library) 标签库 2. EL(Expression Language) 表达式 3. OGNL(Object-Graph N ...
- windows 7 系统进程服务详解
windows 7已经发布有段时间了,相信很多网友都已经换上了传说中非常完美的win7系统.win7不仅继承而且还超越了vista的美观界面,性能优化方面也下足了功力.还拥有强大的win xp兼容性, ...
- MVC之ActionResult
一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...
- redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
超时 Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: jav ...
- C语言的本质(32)——C语言与汇编之C语言内联汇编
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...
- 健康管理app要注意哪些要点
健康管理app现在变得越来越热,越来越多的垂直领域的加入,让健康app的市场逐渐扩大,但移动健康管理app仍有许多缺陷需要解决.健康管理并不是治病,而是让健康的人更好的保持身体健康状态,让慢性病高风险 ...
- CentOS 6.3安装Nginx 搭建文件服务器
转自:http://www.linuxidc.com/Linux/2012-09/70596.htm 1.配置CentOS 6.2 第三方yum源(CentOS默认的标准源里没有nginx软件包): ...
- UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>
E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Cuckoo hash算法分析
一 基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理 ...