当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    SQL Server FileStream详解

    栏目:win服务器问题汇总 时间:2019-12-07 17:55

    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]