方法 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. python之第一个例子hello world

    python用缩进(四个空格,不是teble)来区分代码块 1. coding=utf-8    字符编码,支持汉字 #!/usr/bin/env python# coding=utf-8print ...

  2. ASP.NET MVC 4.0 学习3-Model

    Model負責獲取數據庫中的資料,並對數據庫中的數據進行處理. MVC中有關 數據庫 的任務都由Model來完成,Model中對數據資料進行定義,Controller和View中都會參考到Model, ...

  3. 在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0

    //在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0//如果某字符串, 直接传入字符串进来//如果要查找16进制,则用如下格式传参进来: #$1A#$2A#$3A function F ...

  4. JS扩展方法

    JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. 下面给出一个例子 ...

  5. C# 内存泄露

    一.事件引起的内存泄露 1.不手动注销事件也不发生内存泄露的情况 我们经常会写EventHandler += AFunction; 如果没有手动注销这个Event handler类似:EventHan ...

  6. ./configure : /bin/sh^M : bad interpreter

    用命令行来编译Qt的时候发生标题尚的错误. 原因是文件中带有DOS行结束符,必须把它转换成UNix结束符 references: http://stackoverflow.com/questions/ ...

  7. lambda演算

    先了解下相关的知识点(以下都只用先了解简单的概念,建议wiki): BNF范式,上下文无关文法,函数柯里化. lambda读书笔记演算: http://www.blogjava.net/wxb_nud ...

  8. Android ListView实现圆角

    首先呢,我们还是看几个示图: 这种带有圆角的listview' 看起来很棒吧,确实是这样,其实也不能这么说,主要方形太多了,斯通见惯就不值钱了,“物以稀为贵嘛”. 就好比学java都搞androd,很 ...

  9. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  10. hdu 5491 The Next(暴力枚举)

    Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...