SQL Server 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缓冲池,因此该内存可用于查询处理。

以往我们对文件管理有两种方法

1.数据库只保存文件的路径,具体的文件保存在文件服务器(NFS)上,使用时,编程实现从文件服务器读取文件

2.将文件直接以varbinary(max)或image数据类型保存在数据库中。

  上面两种文件存放方式都有问题:第一种方法因为会访问磁盘,故受I/O影响性能不是很好,而且不能很好的进行文件备份;第二种方法虽然解决文件备份(数据库的备份)问题,但是由于字段的字节数太大,对数据库本身也会造成影响,性能也很低下。

  微软在sql Server 2008推出了一种新的方式 - FileStream,它不是一种新的数据类型,而是一种技术,它使sql Server数据库引擎和NTFS文件系统成为了一个整体,它结合了上面两种方式的优点:FileStream使用NT系统来缓存文件数据,而对文件数据的操作可使用Transact-sql语句对其进行插入、更新、查询搜索和备份。

一、FileStream配置

1.配置sql Server安装实例:Start -> All Programs -> Microsoft sql Server 2008 R2 -> Configuration Tools -> sql Server Configuration Manager

右击属性,切换到FILESTREAM标签,勾选如下配置

2. 打开sql Server,并配置如下


  以上也可以通过如下脚本执行:

rush:sql;"> Exec sp_configure filesteam_access_level,2 RECONfigURE

  最后重启sql Server Service

二、实例展示

  创建FileStream类型文件/组

rush:sql;"> --Create filestreamgroup ALTER DATABASE [Archive] ADD FILEGROUP [FileStreamGroup] CONTAINS FILESTREAM GO --Create filestream and association with filestreamgroup above ALTER DATABASE [Archive] ADD FILE ( NAME = N'FileStream',FILENAME = N'D:\Company\Data\sql Server\FileStream') TO FILEGROUP [FileStreamGroup] GO

  创建测试表(注意:如果表包含FILESTREAM列,则每一行都必须具有唯一的行ID)

rush:sql;"> --Create table CREATE TABLE Archive.dbo.Attachment ( [ID] [UNIQUEIDENTIFIER] ROWGUIDCOL NOT NULL PRIMARY KEY,[FileName] NVARCHAR(100) NULL,[createuser] NVARCHAR(100) NULL,[CreateDatetime] DATETIME NULL,[Content] VARBINARY(MAX) FILESTREAM NULL ) FILESTREAM_ON [FileStreamGroup]

  插入一些测试数据

rush:sql;"> --Insert some records INSERT INTO Attachment VALUES (NEWID(),'File Name 1','shg.cpan',GETDATE(),NULL),(NEWID(),CAST('' AS VARBINARY(MAX))),CAST('This is a attachment,which contains all introduction for filestream' AS VARBINARY(MAX)))

  从前台插入一些数据

rush:sql;"> using (sqlConnection conn = new sqlConnection("server=10.7.15.172;database=Archive;uid=sa;pwd=1234;Connect Timeout=180")) { conn.open(); using (sqlCommand cmd = conn.CreateCommand()) { string id = Guid.NewGuid().ToString(); cmd.CommandText = "INSERT INTO Attachment VALUES('" + id + "','File Name 2','" + DateTime.Now + "',@content)"; sqlParameter param = new sqlParameter("@content",sqlDbType.VarBinary,1000000000); param.Value = File.ReadAllBytes(@"D:\Folder\131 u_ex151207.log"); cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } conn.Close(); }

  检索数据

rush:sql;"> SELECT DATALENGTH(CONTENT)/(1024.0 * 1024.0) AS MB,* FROM ATTACHMENT  

结果


  文件系统

  

  上面的文件都是上传的真实文件,只不过没有后缀,如果重命名加上后缀,即可读取,如最后一个是excel文件加上.xls,即可用Excel软件打开此文件

三、注意事项

  请注意以下事项:

•并不是所有的文件存储都适合使用FileStream,如果所存储的文件对象平均大于1MB考虑使用FileStream,否则对于较小的文件对象,以varbinary(max)BLOB存储在数据库中通常会提供更为优异的流性能
•FileStream可以使用在故障集群上(Failover Cluster),但此时FileStream文件组必须位于共享磁盘资源上;
•FILESTREAM 与其他 sql Server 功能的兼容性:sql.105).aspx">https://msdn.microsoft.com/zh-cn/library/bb895334(v=sql.105).aspx

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...