要搞明⽩为什么不要轻易使⽤DBCC SHRINKDATABASE,⾸先要⾼明⽩DBCC SHRINKDATABASE的收缩原理,在数据⽂件并不是所有的空间都被使⽤,⽽是有部分未使⽤空间:包括已删除的数据、⽂件⾃动增长所未使⽤的空间及其⼀些不能被使⽤的碎⽚空间,这些未使⽤空间可通过sp_sapceused得到。执⾏DBCC SHRINKDATABASE后将分配页从⽂件末尾移动到⽂件前部的未分配页,然后进⾏压缩;只有执⾏了TRUNCATEONLYA,才会将空间释放给操作系统。
了解DBCC SHRINKDATABASE的收缩原理我们再来看⼏个问题: 1.DBCC SHRINKDATABASE 收缩后能起到整理数据库⽂件碎⽚?
不能!DBCC SHRINKDATABASE仅仅是将空间给收缩了,并没有做善后处理,数据库⽂件的碎⽚只能是更多了。 2.DBCC SHRINKDATABASE收缩后数据库的速度会快吗?
不能!DBCC SHRINKDATABASE并没有在收缩后执⾏整理索引的步骤,因此,索引的碎⽚会更多,执⾏速度应该会慢⼀些。
3.为什么我每隔⼏天就整理索引,但索引的碎⽚仍然产⽣的很快?
参考第⼆条,估计是你在执⾏索引整理后,⼜执⾏了DBCC SHRINKDATABASE。
什么时候使⽤DBCC SHRINKDATABASE?
只有产⽣许多未使⽤空间的操作(如截断表或删除表操作)后,执⾏收缩操作最有效,产⽣碎⽚较少。
总结:
DBCC SHRINKDATABASE并不是不能使⽤,⽽是要慎重使⽤,尤其不要频繁使⽤,因为它会增加数据库碎⽚的程度。DBCC SHRINKDATABASE的详细⽤法请参考MSDN 备注:
A: TRUNCATEONLY 将⽂件末尾的全部可⽤空间回收给操作系统。但是,TRUNCATEONLY 不在⽂件内执⾏任何页移动。指定的⽂件只被收缩到最近分配的区。如果随 TRUNCATEONLY ⼀起指定,则忽略 target_percent。
因篇幅问题不能全部显示,请点此查看更多更全内容