设为首页 收藏本站
查看: 1191|回复: 0

[经验分享] 《Microsoft Sql server 2008 Internals》读书笔记--第七章Special Storage(4)

[复制链接]

尚未签到

发表于 2016-11-7 07:04:07 | 显示全部楼层 |阅读模式
《Microsoft Sql server 2008 Internals》索引目录:  《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


  
DSC0000.png
  更详细的资料,请看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语句立刻移走所有的文件夹和文件,因为我们没有任何机会进行后续日志操作。然后增加三行数据,并删除其中的一条。
  USE master;GODROP DATABASE MyFilestreamDB;GOCREATE DATABASE  MyFilestreamDB  ON  PRIMARY(NAME = N'Rowdata1', FILENAME = N'd:/data2/Rowdata1.mdf' , SIZE = 2304KB ,MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),FILEGROUP  FileStreamGroup1  CONTAINS FILESTREAM  DEFAULT(NAME = N'FSData1', FILENAME = N'd:/data2/filestream1' ),FILEGROUP  FileStreamGroup2  CONTAINS FILESTREAM(NAME = N'FSData2', FILENAME = N'd:/data2/filestream2' )LOG ON(NAME = N'FSDBLOG', FILENAME = N'c:/data2/FSDB_log.ldf' , SIZE = 1024KB ,MAXSIZE = 2048GB , FILEGROWTH = 10%);GOUSE MyFilestreamDB;GOCREATE TABLE dbo.Records(Id [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,SerialNumber INTEGER UNIQUE,Chart_Primary VARBINARY(MAX) FILESTREAM NULL)FILESTREAM_ON FileStreamGroup1;GOINSERT INTO dbo.RecordsVALUES (newid(), 1,CAST (REPLICATE (CONVERT(varchar(MAX), 'Base Data'),10000) as varbinary(max))),(newid(), 2,CAST (REPLICATE (CONVERT(varchar(MAX), 'New Data'),10000) as   varbinary(max))),(newid(), 3, 0x);GOBACKUP DATABASE MyFileStreamDB to disk = 'D:/BackupDb/FBDB.bak';GO此时我们删除一条记录DELETE dbo.RecordsWHERE SerialNumber = 2;GO
  此时,还有三个文件。
DSC0001.png

  在5 秒内赶紧备份:
  BACKUP LOG  MyFileStreamDB to disk = 'D:/BackupDb/FBDB_log.bak';CHECKPOINT;
  5秒后文件变成了两个。

  
  FileStream的元数据
  

在SQL Server表中。针对filestream需要的存储并不复杂。在行自身,每个filestream列包含一个48字节的文件指针。即便你用DBCC Page命令,也没有更多的关于此文件的信息。然而,SQL Server提供了一个新函数以转换这个文件指针为一个UNC路径名。UNC值格式大致如下:
//<Server_name>/<share_name>/v1/<db_name>/<object_schema>/<table_Name>/<column_name>/<GUID>

SELECT Chart_Primary, Chart_Primary.PathName()FROM dbo.RecordsWHERE SerialNumber = 1;GO--//AP4/AGRONET08/v1/MyFilestreamDB/dbo/Records/Chart_Primary/8D43AD9A-B755-4AA1-9D73-4B7FAD317289
  关于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)。
  
邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296701-1-1.html 上篇帖子: SQL Server中查看那个进程阻塞数据库的存储过程,收藏了 下篇帖子: 如何将数据导入到 SQL Server Compact Edition 数据库中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表