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 Files\Test_Jerry_SS_01.ss'),
( NAME =test1dat3, FILENAME ='H:\Database Data Files\Test_Jerry_SS_02.ss'),
( NAME =test1dat4, FILENAME ='H:\Database Data Files\Test_Jerry_SS_03.ss'),
( NAME =test1dat5, FILENAME ='H:\Database Data Files\Test_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?

SQL Server ->> Sparse File(稀疏文件)的更多相关文章

  1. SQL Server通过File Header Page来进行Crash Recovery

    SQL Server通过File Header Page来进行Crash Recovery 看了盖总的一篇文章 http://www.eygle.com/archives/2008/11/oracle ...

  2. 关于SQL Server中分区表的文件与文件组的删除(转)

    在SQL Server中对表进行分区管理时,必定涉及到文件与文件组,关于文件与文件组如何创建在网上资料很多,我博客里也有两篇相关转载文件,可以看看,我这就不再细述,这里主要讲几个一般网上很少讲到的东西 ...

  3. SQL Server 无法打开物理文件的 2 种解决办法

    解决方法: 方法1.无法打开可以能是没有权限.如果是这样以管理员身份运行Managerment Studio就可以了. 方法2.找到指定的数据库文件.右键属性-->安全-->勾上  ‘完全 ...

  4. SQL SERVER数据库删除LOG文件和清空日志的方案

    原文:SQL SERVER数据库删除LOG文件和清空日志的方案 数据库在使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间.SQL Server数据库都有log文件,log文 ...

  5. sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)

    转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...

  6. SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题

    SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题 最近服务器执行收缩日志文件大小的job老是报错 我所用的一个批量收缩日志脚本 USE [master] GO /*** ...

  7. sql server 2000,Log.LDF文件丢失,附加数据库失败的解决办法[转]

    SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.下面将主要讨论一下后者的备份与恢复. ...

  8. SQL SERVER 查看mdf ldf文件路径

    SQL SERVER 查看mdf ldf文件路径 select filename from sysfiles

  9. SQL Server数据库状态和文件状态

    数据库状态 (database states) 查询数据库的当前状态 : 1.查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列 user master go se ...

随机推荐

  1. MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb,因生命期有各种变化,因此对此表的更新写操作非常多,老大给我看了一篇文章,才知道mongodb已经支持lsm存储方式了. 原文如连接:http ...

  2. (转)CentOS分区操作详解

    CentOS分区操作详解 原文:http://blog.csdn.net/yonggeit/article/details/77924393 磁盘分区 分区格式的两种选择:MBR和GPT 分区命令: ...

  3. 403 for URL: http://www.terracotta.org/kit/reflector

    前面因为在一个项目中使用了ehcache.xml配置文件,后面启动tomcat的时候报下面的错误 java.io.IOException: Server returned HTTP response ...

  4. java.security.MessageDigest的使用之生成安全令牌!

    时候,我们需要产生一个数据,这个数据保存了用户的信息,但加密后仍然有可能被人使用,即便他人不确切的了解详细信息... 好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接 ...

  5. WPF实现无刷新动态切换多语言(国际化)

    1. 在WPF中国际化使用的是 .xaml文件的格式 如图:Resource Dictionary (WPF) 2. 创建默认的语言文件和其他语言文件 这里以英语为默认语言,新建一个 Resource ...

  6. MySQL wait_timeout参数设置与网上常见错误小纠

    discard connection com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link fail ...

  7. window.location.href.substr(window.location.href.length - 6)

    if (window.location.href.substr(window.location.href.length - 6) == "flag=1") { var tOptio ...

  8. jQuery实现单击和鼠标感应事件。

    1.实现单击事件动态交替http://www.cnblogs.com/ahthw/p/4232837.html讲到了toggleClass(),对于单击事件而言,jQuery同样提供了动态交替的tog ...

  9. CSS3——transform2D的应用

    前言: 关于CSS3,我想最让人感到有意思的就是2D和3D的技术,这让我们的网页立马丰富起来,可以让我们完成一些很酷很炫的效果,比如旋转木马.经过一段时间的学习,让我对CSS3有了更近一步的了解,在此 ...

  10. Java 基础(7)——运算符

    学完基础的变量常量等知识.再往后和变量常量紧密相关的当然是加减乘除等等运算方法了~(当然加减乘除也只是一部分) 首先按照运算过程参与的元素,把运算符号简单粗暴的分为一元运算符.二元运算符.三元运算符等 ...