SQL Server 2008新特性——FILESTREAM

FILESTREAM简介

FILESTREAM是SQL Server 2008中的一个新特性,允许以独立文件的形式存放大对象数据,而不是以往一样将所有数据都保存到数据文件中。以往在对业务系统的文件进行管理时有两种方法,一种是将文件保存到服务器文件系统中,数据库中只保存了该文件的路径,在使用该文件时应用程序连接到服务器读取文件;另一种是将文件以varbinary(max)或image数据类型保存到SQL Server中。而SQL Server 2008提供了FILESTREAM,结合这两种方式的优点。

FILESTREAM使SQL Server数据库引擎和NTFS文件系统成为了一个整体。Transact-SQL语句可以插入、更新、查询、搜索和备份FILESTREAM数据。FILESTREAM使用NT系统缓存来缓存文件数据。这有助于减少FILESTREAM数据可能对数据库引擎性能产生的任何影响。由于没有使用SQL Server缓冲池,因此该内存可用于查询处理。

在SQL Server中,BLOB可以是将数据存储在表中的标准varbinary(max)数据,也可以是将数据存储在文件系统中的FILESTREAM varbinary(max)对象。数据的大小和应用情况决定您应该使用数据库存储还是文件系统存储。如果满足以下条件,则应考虑使用FILESTREAM:

  • 所存储的对象平均大于1MB。
  • 快速读取访问很重要。
  • 您开发的是使用中间层作为应用程序逻辑的应用程序。

对于较小的对象,将varbinary(max)BLOB存储在数据库中通常会提供更为优异的流性能。

FILESTREAM存储以varbinary(max)列的形式实现,在该列中数据以BLOB的形式存储在文件系统中。BLOB的大小仅受文件系统容量大小的限制。文件大小为2GB的varbinary(max)标准限制不适用于存储在文件系统中的BLOB。

若要将指定列使用FILESTREAM存储在文件系统中,对varbinary(max)列指定FILESTREAM属性。这样数据库引擎会将该列的所有数据存储在文件系统,而不是数据库文件中。

FILESTREAM数据必须存储在FILESTREAM文件组中。FILESTREAM文件组是包含文件系统目录而非文件本身的专用文件组。这些文件系统目录称为“数据容器”。数据容器是数据库引擎存储与文件系统存储之间的接口。

使用FILESTREAM存储时,需要注意以下内容:

  • 如果表包含FILESTREAM列,则每一行都必须具有唯一的行ID。
  • 不能嵌套FILESTREAM数据容器。
  • 使用故障转移群集时,FILESTREAM文件组必须位于共享磁盘资源上。
  • FILESTREAM文件组可位于压缩卷上。

使用FILESTREAM

在开始使用FILESTREAM之前,必须在SQL Server数据库引擎实例中启用FILESTREAM。具体启用数据库实例FILESTREAM的操作如下:

(1)在SQL Server配置管理器中打开SQL Server数据库引擎的属性窗口,切换到FILESTREAM选项卡,如图所示。

(2)选中“针对Transact-SQL访问启用FILESTREAM”复选框,其他的选项是针对Windows进行读写的,可以都选中,然后单击“确定”按钮保存对FILESTREAM的设置。

(3)打开SSMS连接到数据库实例,右击数据库实例,选择“属性”选项,系统将打开SQL Server实例的属性窗口。

(4)切换的“高级”选项页,在文件流访问级别下拉列表框中选择“已启用完全访问”选项,如图所示。

 

(5)单击“确定”按钮,然后重启数据库实例,FILESTREAM在数据库实例中设置完成。

在启用了数据库实例的FILESTREAM后,接下来就需要设置数据库的FILESTREAM和创建具有FILESTREAM数据列的表:

(6)对应新建的数据库,则在创建数据库时创建FILESTREAM文件组,如果是现有数据库,则使用ALTER DATABASE添加FILESTREAM的文件组,例如对TestDB1数据库添加FILESTREAM的文件组,具体SQL脚本如代码:


ALTER DATABASE [TestDB1]
ADD FILEGROUP [FileStreamGroup] CONTAINS FILESTREAM --添加FILESTREAM文件组
GO

ALTER DATABASE [TestDB1]
ADD FILE ( NAME = N'FileStream', FILENAME = N'C:\FileStream) --添加FILESTREAM文件
TO FILEGROUP [FileStreamGroup]
GO

系统将自动创建C:\FileStream文件夹并在其中写入filestream.hdr文件,该文件是 FILESTREAM容器的头文件不能删除,一定要确保在运行该语句之前C:\FileStream并不存在。

(7)创建了FILESTREAM文件组后便可创建和修改表,指定某varbinary(max)类型的列包含FILESTREAM数据。例如创建Files表,该表包含FileID和FIleContent列,具体脚本如代码:

CREATE TABLE Files
(
FileID UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,
ID INT UNIQUE,
FileContent VARBINARY(MAX) FILESTREAM NULL --FILESTREAM类型的二进制
)

管理与使用FILESTREAM

在创建好FILESTREAM表后即可向其中添加、修改和读取数据。SQL Server支持使用T-SQL和WIN32 API两种方式访问FILESTREAM。

对于T-SQL访问FILESTREAM数据列来说,FILESTREAM是完全透明的,也就是说,T-SQL仍然使用一般的访问varbinary(max)数据列的方式访问,并不会因为是FILESTREAM列而有所不同。

例如向Files表中插入数据、修改表数据和删除数据的SQL脚本如代码:


INSERT INTO Files --插入测试数据
VALUES (newid (),1, CAST('TestFileStream1' as varbinary(max)));
GO

UPDATE Files --更新测试数据
SET FileContent=CAST('TestFileStream2' as varbinary(max))
WHERE ID=1
GO

DELETE FROM Files --删除测试数据
WHERE ID=1

无论是插入数据还是修改数据,SQL Server都将在文件系统中创建新的文件来保存最新的修改文件内容,修改或删除数据后文件系统中的文件将保留,而不会被同时删除。

使用FILESTREAM来存储二进制大型对象(BLOB)数据时,可使用Win32 API来处理文件。为了支持在Win32应用程序中处理FILESTREAMBLOB数据。所有FILESTREAM数据容器访问都是在SQL Server事务中执行的。可在同一事务中执行T-SQL语句以保持SQL数据和FILESTREAM数据之间的一致性。

时间: 2024-12-30 12:53:59

SQL Server 2008新特性——FILESTREAM的相关文章

SQL Server 2008新特性之数据仓库可扩展性(一)

1.导言 Microsoft SQL Server 2008提供了一个全面的数据仓库平台.它使得你可以使用一套单独的.整合的 产品套件建立和管理你的数据仓库,并使你可以为你的用户提供洞察信息.它可以满足最大规模企业的需 求,给予你的终端用户和IT员工所需的权利. 在SQL Server 2008版本中部署方面首先要关注的是要改进整个产品套件的可扩展性以充分满足大型企 业的需求.这里,我们将介绍我们已经添加的用于改进你的数据仓库体验的特性和改进之处.建立.管理 .传送.SQL Server 200

SQL Server 2008新特性——更改跟踪

在大型的数据库应用中,经常会遇到部分数据的脱机和多个数据库的合并问题.比如现在有一个全省范围使用的应用程序,每个市都部署了单独的相同的应用程序服务器和数据库服务器,每个月需要将全省所有市的数据全部汇总起来用于出全省的报表,这是一种很常见的数据库合并问题.再比如我们做了一个SmartClient的应用程序,每个客户端都有应用程序和数据库,另外还有一个中心数据库用于汇总所有客户端的数据.每个智能客户端上都可以对自己的数据库进行增删改查,一旦智能客户端连接到网络上时,系统就将客户端数据库中的数据更改全

SQL Server 2008新特性——SSMS增强

SQL Server 2008已经发布很多天了,今天来总结一下我们最常用的工具SSMS在SQL 2008中的一些改进: 1.在注册的服务器组中一次SQL查询可以针对多个服务器执行. 首先是要在"已注册的服务器"中创建组,也可以使用系统默认的组,然后添加多个数据库到组中.接下来右击数据库组,选择"新建查询"选项,系统将打开一个多数据库查询的编辑器,选择多个服务器中公共的数据库,在其中输入SQL语句F5执行即可将多个服务器中的数据一次性都查询出来. 2.可以为不同的服务

SQL Server 2008新特性——策略管理

策略管理是SQL Server 2008中的一个新特性,用于管理数据库实例.数据库以及数据库对象的各种属性.策略管理在SSMS的对象资源管理器数据库实例下的"管理"节点下,如图: 从图中可以看到,策略管理中包含三个节点:策略.条件.方面. 方面就是策略要应用的对象,包括:服务器.表.触发器.视图.存储过程--这些方面对象都是系统定义好了的,仅供瞻仰不可更改.双击具体的某一个方面可以查看该方面的属性,在定义条件时即可对这些属性进行判断,如图为存储过程方面的属性.   条件就是一个布尔表达

SQL Server 2008新特性之数据仓库可扩展性(二)

3.10 资源监控器 SQL Server 2008中新的资源监控器使你可以控制分配给你的关系型数据库工 作负载不同部分的CPU和内存资源的数量.它可以用来防止失控查询(它阻止资源分配给其它工作负载)以 及为你的工作负载重要部分预留资源.SQL Server 2005资源策略平等地对待所有的工作负载,并按需分 配共享资源(例如,CPU带宽.内存).这有时会引起资源分配不按比例,从而导致性能不均衡或意料外的 速度降低. 资源监控器的首要目标如下所示: a. 监控:使得可以监控每组请求的资源消 耗(

SQL Server 2008 新特性 总结复习(一)_mssql2008

1. TVP, 表变量,临时表,CTE 的区别 TVP和临时表都是可以索引的,总是存在tempdb中,会增加系统数据库开销,而表变量和CTE只有在内存溢出时才会被写入tempdb中.对于数据量大,并且反复使用,反复进行查询关联的,建议使用临时表或TVP,数据量小,使用表变量或CTE比较合适 2. sql_variant 万能类型 可以存放所有数据类型,相当于C#中的object数据类型 3. datetime, datetime2, datetimeoffset datetime 时间有效期较小

小心SQL SERVER 2014新特性——基数评估引起一些性能问题

  在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享" 里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER 2014后,发现一个SQL出现性能问题,当时分析后发现执行计划变了,导致SQL出现了性能问题.但是没有彻底搞清楚为什么出现这种情况.当时看到 Actual Number of Rows 与Estimated Number of Rows之间的偏差较大(统计信息是最新的),以为是优化器的Bug造成的.其

谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

原文:谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 篡写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源调控器: 第二部分:SQL Server中资源调控器: 第三部分:SQL Server资源调控器运用场景-CPU: 第四部分:SQL Server资源调控器运用场景-IO: 第五部分:总结: 第六部分:作者简介:

小心SQL SERVER 2014新特性&amp;mdash;&amp;mdash;基数评估引起一些性能问题

    在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER 2014后,发现一个SQL出现性能问题,当时分析后发现执行计划变了,导致SQL出现了性能问题.但是没有彻底搞清楚为什么出现这种情况.当时看到Actual Number of Rows 与Estimated Number of Rows之间的偏差较大(统计信息是最新的),以为是优化器的Bug造成的.其