《Microsoft Sql server 2008 Internals》读书笔记--目录索引
上文简单介绍了filestream数据的基础,本文继续了解FileStream的一些特性。
■ 更新FileStream数据
当使用Updte修改一个fileStream列时,包含数据的文件被修改,文件相应增加或减少。特别是,设置一个列为空时,零值引起文件大小为0。而且,在第一次释放时,T-SQL的(用.Write子句定义的)分块更新(Chunked update)不被支持。(邀月注:Write子句,参看MSDN:http://msdn.microsoft.com/en-us/library/ms177523.aspx )推荐使用文件系统流访问来操作(包含insert和Update)你的Filestream数据。针对Filestream的Update通常被执行为Delete+Insert操作。因此,在这个列更新后将在目录下看到一个新的行。
当一个filestream单元格被设置为null时,与这个单元格相关的filestream文件在GC运行时被删除。
■ 删除FileStream数据
当使用delete或truncate table语句删除一行时,任何与这行相关的文件都被删除。但这两个删除并不是同步进行的。文件被GC线程删除。有时候说delete是update的一部分也是对的。一个新行增加,但旧行直到GC运行时才会被物理移走。
注意:数据操作(包括insert,update,delete,merge)的output子句像它在列修改中一样被支持。但是,如果你使用output子句往一个带有varbinary(max)的列(该列没有使用filestream定义)的表中插入数据时,如果数据大于2GB时,可能会报运行时错误。
■ FileStream数据和事务
Filestream数据操作基于完全事务的。但是在你操作filestream时,不是所有的隔离等级都被支持的。
Isolation level | Transact SQL access | File system access |
---|---|---|
Read uncommitted | SQL Server 2008 | Unsupported |
Read committed | SQL Server 2008 | SQL Server 2008 |
Repeatable read | SQL Server 2008 | Unsupported |
Searializable | SQL Server 2008 | Unsupported |
Read committed snapshot | SQL Server 2008 R2 | SQL Server 2008 R2 |
Snapshot | SQL Server 2008 R2 | SQL Server 2008 R2 |
更详细的资料,请看MSDN:http://msdn.microsoft.com/en-us/library/ms173763%28SQL.105%29.aspx
■ 记录FileStream变化
正如前文提到,每个fielstream文件组都有一个$FSLOG文件夹,它的作用就是跟踪对所有与文件组相关的filestream活动。这些数据在你执行事务日志备份(backup)与还原(restore)操作时使用,在恢复(recover)进程中也用。
$FSLOG文件夹主要跟踪对增加到filestream文件组的新信息。下列操作引起日志文件夹的增加:
1、一个包含fielstream数据的新表被创建
2、一个fielstream列被定义
3、一个在filestream列中包含not-null值数据的行被insert
4、一个filestream值被update
5、一个事务提交(Commit)发生
这儿是一些例子:
■如果你创建一个包含两个filestream列的表,4个文件被加到$FSLOG文件夹---一个是表,两个对应列,一个对应Commit
■如果你在一个自动提交事务中插入一个包含filestream数据的行,2个文件被加到$FSLOG文件夹---一个对应Insert,一个对应Commit
■如果你在一个明确事务中插入一个5 行,6个文件被加到$FSLOG文件 夹
当数据被删除或表被truncate或drop时, 文件并没有被加到$FSLOG文件夹,然而,SQL Server保持了对这些操作的日志跟踪。一个新的元数据(metadata)表包含被移走的数据的信息。
■ FileStream的垃圾回收器(Garbage Collection)
特别,对日志备份,既然事务日志不包含实际filestream数据,所有新的filestream内容必须被备份。仅仅filestream数据才有对于实际filestream内容的redo信息。通常,如果你的数据库没有处于简单恢复模式,你需要在GC从你的filestream文件夹中移走不需要的数据文件前备份两次日志。
我们看一个例子, 删除并reCreate MyFileStreamDB数据库,一个drop语句立刻移走所有的文件夹和文件,因为我们没有任何机会进行后续日志操作。然后增加三行数据,并删除其中的一条。
此时,还有三个文件。
在5 秒内赶紧备份:
5秒后文件变成了两个。
■ FileStream 的元数据
//<Server_name>/<share_name>/v1/<db_name>/<object_schema>/<table_Name>/<column_name>/<GUID>
关于PathName函数的更多用法,请看MSDN:http://msdn.microsoft.com/en-us/library/bb895239.aspx
■ FileStream 的性能考虑
作为Filestream存储的权威指南,可以看这篇文章:http://msdn.microsoft.com/en-us/library/cc949109.aspx
以下是一些要点:
■确认你在用正确的方式存储合适的数据。Jim gray曾经在两年前发表过一篇《To BLOB or not to BLOB》。一般而言,小于256KB应该存储在数据库,大于1M,则应该存储在文件系统中。这之间的数据根据测试应用程序来选择。如果你使用filestream不存储一些过小的large 对象将不会有一个好的性能体验。
■针对NTFS卷(存放fielstream数据的容器)使用合适的RAID级别,如RAID5用于写敏感工作模式。
■使用合适的磁盘技术,SCSI通常比SATA/IDE要快,因为有更高的转速,更低的热量和寻道次数。同时SCSI要更多的money
■无论使用什么磁盘技术。如果是SATA,确认它支持NCQ。如果是SCSI,确保它支持CTQ,这两者都允许多线程,并发I/O访问。
■在设置filestream前,如果需要,请整理NTFS卷,定期整理会保持好的查询性能。
■在NTFS卷使用命令行fsutil关闭8.3命名限制。否则检测文件是否存在将会使insert和update执行时性能下降很多。
■使用fsutil关闭最后一次访问时间跟踪。
■设置合适的NTFS簇大小。对于大于1M的larger 对象,使用64KB大小的簇会有助于减少整理。
■一个filestream的局部更新会创建一个新文件,批量小数据的更新放到一个大的更新会减少碎片。
■当一个流数据到客户端时,使用SMB缓存大小最好为60KB左右,l因为TCP/IP缓存为64KB。
本文主要介绍了filestream的相关入门知识,下文将介绍稀疏列(Sparse columns) 。
助人等于自助! 3w@live.cn