SQL Server FileStream详解

 更新时间:2015年12月24日 14:41:10   作者:舍长  
FILESTREAM是SQL Server 2008中的一个新特性,允许以独立文件的形式存放大对象数据,而不是以往一样将所有数据都保存到数据文件中

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,并配置如下 


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

Exec sp_configure filesteam_access_level, 2
RECONFIGURE 

  最后重启SQL Server Service

 

二、实例展示

  创建FileStream类型文件/组

--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)

--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] 

  插入一些测试数据

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

  从前台插入一些数据

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','shg.cpan','" + 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();
}

  检索数据 

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 功能的兼容性:https://msdn.microsoft.com/zh-cn/library/bb895334(v=sql.105).aspx

相关文章

  • SQL Server AlwaysOn读写分离配置图文教程

    SQL Server AlwaysOn读写分离配置图文教程

    这篇文章主要介绍了SQL Server AlwaysOn读写分离配置图文教程,需要的朋友可以参考下
    2017-09-09
  • 简单介绍SQL Server里的闩锁

    简单介绍SQL Server里的闩锁

    这篇文章我们探讨了SQL Server里的闩锁,以及如何使用DMV sys.dm_os_wait_stats 和sys.dm_os_latch_stats进行闩锁等待的故障排除,需要的朋友可以参考下
    2015-07-07
  • SQL中limit的用法小结(一个参数,两个参数)分页查询

    SQL中limit的用法小结(一个参数,两个参数)分页查询

    Limit通常用于SELECT语句的末尾,用于限制查询结果的数量,这篇文章主要介绍了SQL中limit的用法(一个参数,两个参数),分页查询,需要的朋友可以参考下
    2023-12-12
  • SQLServer数据库误操作恢复的方法

    SQLServer数据库误操作恢复的方法

    本文主要介绍了SQLServer数据库误操作恢复的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • SQL窗口函数的使用方法

    SQL窗口函数的使用方法

    MySQL8.0版本之后,加入了窗口函数功能,简化了数据分析工作中查询语句的书写。本文主要介绍了SQL窗口函数的使用方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • SQLServer行转列实现思路记录

    SQLServer行转列实现思路记录

    SQLServer行转列的sql语句有很多,可以使用静态的、动态的、Case When等等,均能实现
    2014-06-06
  • sql server建表时设置ID字段自增的简单方法

    sql server建表时设置ID字段自增的简单方法

    这篇文章主要介绍了 sql server建表时设置ID字段自增的简单方法,需要的朋友可以参考下
    2017-10-10
  • 彻底删除SQL Server注册表的方法

    彻底删除SQL Server注册表的方法

    在卸载SQL Server后,大家都希望能够将注册表信息完全删干净,下面就将教您彻底删除SQL Server注册表的方法,需要的朋友可以参考下
    2015-08-08
  • SQLServer 批量导入目录文件

    SQLServer 批量导入目录文件

    可以用扩展存储过程xp_dirtree获取文件列表,用openrowset倒入数据到二进制字段。
    2009-08-08
  • MySql 安装时的1045错误

    MySql 安装时的1045错误

    MySql安装到最后一步的时候,出现1045的错误有两种解决办法。
    2009-07-07

最新评论