对于磁盘碎片的清理,现在已经有了非常多的工具,包括微软自带和第三方的,我这里只是稍微的列举一下:Windows defrag, Power Defra, Page Defrag。

  说完了磁盘碎片,我来看看SQL Server的碎片问题。首先要说的是:它们二者是不一样的。

  SQL Server采用了比较高级的存储系统(或者说它的存储机制的设计和Windows中一般保存文件的存储机制不一样),使得多个磁盘可以串联起来一起工作,而且还改变了文件的读取和存储的方式。物理磁盘的碎片终是从从硬件上面解决,不能通过一些运行脚本的方式解决,而SQL Server中的碎片,则是可以的。

  SQL Server存储机制使得它可以使用多磁盘存储设备,例如RAID,SAN和NAS等。磁盘控制器在这些设置中控制着读取数据的操作。在这些设备中,数据被分布在多个磁盘驱动器上面,形成块,和条带。因为数据被分布的保存,在读取的时候是多个磁盘并行读取,后每个读取出来的分布数据被组合,成为一个大的数据,传递给上面。这里不在深入了,因为再说要涉及到那些N复杂的存储结构,I/O总线了。

  我这里只给几个图,大家看看而已:

其实说了这么多,只是想要告诉朋友们,这里数据保存的不连贯,是因为设计到形成的。这和之前讲的那个磁盘碎片中数据的保存的不连贯的原因是不一样的。

  到这里大家可能开始不明白了,可能要问:尽管把数据这样分布保存在多个磁盘上面,对于每个磁盘上面,依然会有碎片?

  有个疑问,说明大家在思考了。

  这里一个要理解的重要概念是:多磁盘存储系统中的磁盘控制器。这个控制器同时也具有碎片清理的功能,并且它还协调数据的读写操作。也是说,这个控制器已经在磁盘级别做了清理工作。那么,对于SQL Server而言,只要自身清理碎片行了。而如何清理SQL Server产生的碎片,只有SQL Server本身知道,这属于它的内部机制,控制器无法操作。

  我下面用一个草图来区分SQL Server碎片和磁盘碎片的不同作为本篇文章的总结:

也是说:即使分配给数据库文件的磁盘空间没有碎片,数据库本身还是会产生碎片,而且他们产生碎片的层级是不一样的。磁盘可以看出是在底层硬件基本,而数据库可以看出是在软件级别。当然,说的不可能完全对,只是个人理解,大家明白行了。

  有任何问题,欢迎提出。