方法 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 不起作用的更多相关文章

  1. [转帖]SQL Server DBCC命令大全

    SQL Server DBCC命令大全   原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPC ...

  2. 再谈SQL Server中日志的的作用

    简介     之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅:     浅谈SQL Server ...

  3. SQL Server DBCC命令大全

    原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPCLEANBUFFERS:从缓冲池中删除所有缓 ...

  4. SQL Server 中日志的的作用(Redo和Undo)

    简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...

  5. SQL Server创建视图——视图的作用

    视图简介: 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口. 常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 . ...

  6. SQL Server 2012 Express LocalDB 的作用

    微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio ...

  7. SQL server 2005中无法新建作用(Job)的问题

    1.在使用sqlserver2005创建作业时,创建不了,提示 无法将类型为“Microsoft.SqlServer.Management.Smo.SimpleObjectKey”的对象强制转换为类型 ...

  8. SQL Server dbcc checkdb 做了什么。

    第一步: 读取系统元数据.读完这些数据后dbcc checkdb 就知道自己要检测的是一个怎样的数据库了.如果在这一步就出错了.dbcc 就直接出错 了.不会再运行下去. 第二步: 在dbcc che ...

  9. SQL Server dbcc checkdb 修复

    默认dbcc checkdb 只做数据库的检测数据库是否完好.不会主动做数据库的修复,要修复数据库,需要数据库设单用模式. 1.repair_allow_data_loss  可能导致数据丢失. 2. ...

随机推荐

  1. [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. Oracle的几种索引

    Oracle 提供了多种不同类型的索引以供使用.简单地说, Oracle 中包括如下索引: 1. B* 树索引 这些是我所说的 “ 传统 “ 索引.到目前为止,这是 Oracle 和大多数其他数据库中 ...

  3. C# 操作IE浏览器

    最近的一个B/S系统中,用到了指模录入,当用户按了手指摸之后,要在IE浏览器的一个文本框上显示用户的姓名.由于要监控指模机的输入,因此客户端需要装一个.net控制台程序,通过此控制台程序监控指模机.这 ...

  4. C#安装程序制作让安装后的程序开机自动运行

    1.创建安装项目后要在自己的解决方案是添加一个新的类库项目(ClassLibrary1),并在新类库中添加一下安装程序类(Installer1),在Installer1类中添加如下代码: string ...

  5. [ ArcGIS Server技术版]如何得到本机上的所有的REST服务?

    http://server.arcgisonline.com/ArcGIS/rest/services?f=json得到的字符串 {"currentVersion":10.01,& ...

  6. unity3d 导出 Excel

    我在unity里需要导出成Excel格式,试了一些方法,其中用c#的com组件的我还没成功不知道该怎么在unity里调用,(如果哪位大哥用别的方法在unity里成功了,可以交流下,最好给我一个小dem ...

  7. bzoj1654 [Usaco2006 Jan]The Cow Prom 奶牛舞会

    Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in ...

  8. 生成excel文件

    java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007.poi是apache下的一个子项目,poi应该是处理ms的o ...

  9. UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>

    L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  10. 关于#ifndef,#define,#end的说明

    #ifndef,#define,#end 是宏定义的一种---条件编译 这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h single.h: #include ...