SQL Server ->> Sparse File(稀疏文件)

Sparse File(稀疏文件)不是SQL Server的特性。它属于Windows的NTFS文件系统的一个特性。如果某个大文件中的数据包含着大量“0数据”(这个应该从二进制上看),这样的文件就可以被称之为稀疏文件。如果从二维图上看这个文件你会发现文件就像很多很多洞一样,这就是“稀疏”的由来。这种文件造成的问题是空间浪费。比如说如果你现在用VMWare Workstatation创建了一个虚拟机,初始化磁盘大小为40G,VM必然会为虚拟机生成一个或者多个.vmdk文件。如果文件系统真的分配40G的物理磁盘空间给虚拟机磁盘文件,实际上是很大的浪费,因为它根本没用到这么多。那解决办法有几种。第一种是在分配整个完整大小的空间,然后把没有用到的空间都写0,然后用NTFS的压缩技术压缩文件大小。这种做法虽然算是解决了空间浪费的问题,但是是有代价的,文件从缓存写入磁盘前的压缩过程和文件解压缩的过程是有代价的,对于一个文件操作繁忙的系统或应用程序而言如此频繁的压缩和解压缩操作是很大代价的。

NTFS中处理这种文件的做法是只在文件的内容区域块不是大量的0数据才分配空间。当缓存中的文件内容在写入磁盘前被检出出存在大量区块的0数据,NTFS不会把这部分数据也写入磁盘,而是自己维护着一份列表,记录下0数据的位置。这样当读取文件操作发生并且读取到0数据时,NTFS再为读取操作写入0数据到缓冲区。

那我们再谈回来稀疏文件和SQL Server有什么关系?SQL Server会在NTFS系统生成很多类型的文件,而当中的Database Snapshots和DBCC CHECKDB命令产生的文件就是稀疏文件。DBCC CHECKDB命令在运行过程中所产生的数据都是存储在数据库内部快照(Database Internal Snapshots)里面的。

这里我试下创建一个数据库快照然后来观察下快照文件所占用磁盘空间的大小

CREATE DATABASE Test_Jerry_SS
ON
( NAME =Test_2, FILENAME ='H:Database Data FilesTest_Jerry_SS_01.ss'),
( NAME =test1dat3, FILENAME ='H:Database Data FilesTest_Jerry_SS_02.ss'), 
( NAME =test1dat4, FILENAME ='H:Database Data FilesTest_Jerry_SS_03.ss'),
( NAME =test1dat5, FILENAME ='H:Database Data FilesTest_Jerry_SS_04.ss')
AS SNAPSHOT OF [Test_Jerry]
GO

实际大小仅为128KB

参考文献:
Sparse Files

Sparse File Operations

NTFS Sparse Files For Programmers

What are Sparse Files and Why Should I Care as SQL Server DBA?

原文地址:https://www.cnblogs.com/jenrrychen/p/5000727.html