SQL Server的FileStream和FileTable深入剖析

互联网时代数据是爆炸式增长,我们常常需要把结构化数据和非结构化数据(如文档,演示文稿,视频,音频,图像)存储在一起。通常有几种方案:

1。在数据库中存储结构化数据,在文件系统中存储非结构化数据,然后数据库里有一个字段记录文件系统的路径,虽然这种方法成本合算,但它引入了额外的复杂度,因为你需要手动去保证跨关系和非关系系统管理事务的完整性。
2。将结构化数据和非结构化数据都存储在数据库中,多年以来,数据库一直都支持存储非关系数据,如二进制大对象,或BLOB,SQL Server称之为varbinary数据类型,这样的好处是能充分利用数据库的特性(如事务支持,备份和恢复支持,集成安全性的支持,全文搜索支持等),但成本费用会更高,所需的磁盘空间更多,因为是存储在同一行数据里,存储和检索时间更长,对应用程序的整体性能也会有负面影响。(如果你写查询时用select * from xxx 就很慢了)
3。SQL Server 2008中引入的FILESTREAM数据类型来存储非结构化数据,如文档,演示文稿,视频,音频,图像,数据库中存储的是文件系统上的一个指针。在SQL Server 2008中,新的FILESTREAM(文件流)特性是在现有的varbinary(max)数据类型之上实现的,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问。自动保证了事务的完整性。
4。SQL Server 2012的FileTable则进一步增强,它可以让应用程序通过引入FileTable整合其存储和数据管理组件,允许非事务性访问,提供集成的对非结构化数据和元数据的全文搜索和语义搜索。

下面详细谈谈这两项新功能。
了解在SQL Server 2008中的FileStream
FILESTREAM数据类型作为varbinary(max)列实现的,数据是存储在NTFS文件系统,数据库中存放的是指针。在这种情况下,存储不再是BLOB的2GB大小的限制,只是受制于NTFS文件系统的文件大小。FileStream是默认禁止的,所以你需要对varbinary(max)列指定FILESTREAM属性。这样SQL Server才不会把BLOB存到SQL Server数据库,而是存到NTFS文件系统。
将BLOB数据存储在NTFS文件系统上的带来了一些好处:
和直接操作NTFS文件系统的数据流的性能一样
FILESTREAM数据没有使用SQL Server缓冲池的,因此SQL Server缓冲池的查询处理,并不会受到FILESTREAM数据的影响。
不再有BLOB的2G大小的限制。
事务的一致性。
SQLServer集成的安全模型。
备份和恢复时,会包含FILESTREAM BLOB数据。
支持全文搜索。

用SELECT,INSERT,UPDATE和DELETE语句,操作带FILESTREAM数据的表,性能没有变慢。
为了使用这项新功能,我们首先需要在实例级别启用它(在安装过程中,或通过修改SQL Server实例的属性,或通过使用sp_configure来更改实例属性),然后创建或修改数据库,有一个文件组有FileStream属性,然后创建一个表带有varbinary(max)数据类型列,并指定FileStream属性。

了解SQL Server 2012的FileTable
FileTable使用FILESTREAM的基础上进一步加强,它既允许直接的,事务性的,存取FILESTREAM列大型数据。FileTable表也可以配置为允许非事务性访问文件,而无需事先SQLServer授权。

FileTable是一种特殊类型的表,它的结构是固定的,不像普通用户表可以定义自己的字段,就好像它是一个文件夹中的文件系统。一个的FileTable包含的FileStream随着几个文件级属性(file_id,名称,路径,创建日期,修改日期,最后访问时间等),文件和目录层次结构的数据。这意味着FileTable中的每一行数据代表一个文件系统上的文件或目录。

FileTable在文件系统表现为一个indows共享目录,里面有文件和目录数据,你可以通过非事务性的文件访问(基于Windows API的应用程序能够访问文件,而无需SQLServer访问权限)。对于Windows应用程序,这看起来像一个正常的网络共享位置的文件和目录。应用程序可以使用Windows API来管理这个网络共享位置的文件和目录。

Windows API操作是非事务性的,和数据库是不相关。然而,FileTable是基于FileStream实现的,所以SQL的事务是支持的。FileTable也可以通过正常的Transact-SQL命令查询和更新。他们还集成了SQL Server管理工具和功能,如备份和恢复。

我们需要分开配置FileTable和FILESTREAM。这意味着,我们可以继续只使用FileStream的功能,而无需启用非事务性访问或创建FileTable。
开始使用SQL Server 2012的FileTable
启用FileStream


代码如下:

USE master GO
EXEC sp_configure 'filestream access level', 2
Go
RECONFIGURE GO
--You can use this statement to see current
--config value and running value
EXEC sp_configure filestream_access_level;
GO

按 Ctrl+C 复制代码创建LearnFileTable数据库


代码如下:

USE master
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'LearnFileTable')
DROP DATABASE LearnFileTable
GO
CREATE DATABASE LearnFileTable
--Details of primary file group
ON PRIMARY
( NAME = LearnFileTable_Primary,
FILENAME =N'D:\FileTable\LearnFileTable_Data.mdf',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 5MB),
--Details of additional filegroup to be used to store data
FILEGROUP DataGroup
( NAME = LearnFileTable_Data,
FILENAME =N'D:\FileTable\LearnFileTable_Data.ndf',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 5MB),
--Details of special filegroup to be used to store FILESTREAM data
FILEGROUP FSDataGroup CONTAINS FILESTREAM
( NAME = FileStream,
--FILENAME refers to the path and not to the actual file name. It
--creates a folder which contains a filestream.hdr file and
--also a folder $FSLOG folder as depicted in image below
FILENAME =N'D:\FileTable\FSData')
--Details of log file
LOG ON
(Name = LearnFileTable_Log,
FILENAME = 'D:\FileTable\LearnFileTable_Log.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB
)
WITH FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'LearnFileTable')
--Other option for NON_TRANSACTED_ACCESS is READ_ONLY or OFF
GO

按 Ctrl+C 复制代码检查FileStream/FileTable


代码如下:

-- Check the Filestream/FileTable Options
SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc, directory_name FROM sys.database_filestream_options
WHERE DB_NAME(database_id) = 'LearnFileTable'

 
创建FileTable


代码如下:

USE LearnFileTable
GO
CREATE TABLE MyFirstFileTable AS FileTable
WITH
(
FileTable_Directory = 'MyFirstFileTable',
FileTable_Collate_Filename = database_default
);
GO

按 Ctrl+C 复制代码如果我们创建FileTable前没有启用FileStream,会报错
Msg 1969, Level 16, State 1, Line 1 Default FILESTREAM filegroup is not available in database '<database_name>'创建后,我们查询一下,没有记录
USE LearnFileTable SELECT * FROM [dbo].[MyFirstFileTable]
 
在企业管理器选择FileTable,右键 "Explorer FileTable Directory" link as shown below:
 
你会看到网络共享目录. 手动添加几个文件到该目录,我们返回SQLServer企业管理器看看有什么事情发生:
 
再运行一次查询语句
USE LearnFileTable SELECT * FROM [dbo].[MyFirstFileTable]
 
总结
在这篇文章中,我谈到了利用SQL Server的FileStream和FileTable功能存储非结构化的数据。 FILESTREAM功能在文件系统中存储​​非结构化数据,并把文件的指针保存在数据库,而FileTable进一步扩展了这一功能允许非事务性访问(访问文件,而无需事先授权,共享位置)。换句话说,有了这个功能,我们可以通过文件系统来管理非结构化数据,而不是在SQL Server管理,却依然可以在SQL Server中的事务访问这些文件。

(0)

相关推荐

  • SQL Server 2012 安装图解教程(附sql2012下载地址)

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB. sql2012下载 http://www.jb51.net/softs/79861.html 安装SQL Server 2012的软硬件环境参数 根据微软的下载提示,32位的Windows 7操作系统,只需下载列表最下面的CHSx86SQLFULL_x86_CHS_Core.box. CHSx86SQLFULL_

  • SQL Server 2012无法连接到WMI提供程序(Cannot connect to WMI provider)解决方案

    今天一位同事在启动自己工作机的SQL Server 2012配置管理器时遇到如下报错: 无法连接到 WMI 提供程序.您没有权限或者该服务器无法访问.请注意,您只能使用 SQL Server 配置管理器来管理 SQL Server 2005 服务器. 找不到指定的模块. [0x80041010] Cannot connect to WMI provider. You do not have permission or the server is unreachable. Note that yo

  • Microsoft SQL Server 2012 数据库安装图解教程

    我们下载地址:http://www.jb51.net/softs/79861.html 官网下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=29066 1. 根据微软的下载提示,64位的Windows7操作系统,只需下载列表的CHSx64SQLFULL_x64_CHS_Core.box.CHSx64SQLFULL_x64_CHS_Intall.exe和CHSx64SQLFULL_x64_CHS_Lang.box三个安装包即

  • SQL Server 2012 FileTable 新特性详解

    FileTable是基于FILESTREAM的一个特性.有以下一些功能: •一行表示一个文件或者目录. •每行包含以下信息: • •file_Stream流数据,stream_id标示符(GUID). •用户表示和维护文件及目录层次关系的path_locator和parent_path_locator •有10个文件属性 •支持对文件和文档的全文搜索和语义搜索的类型列. •filetable强制执行某些系统定义的约束和触发器来维护命名空间的语义 •针对非事务访问时,SQL Server配置FIL

  • SqlServer2012中First_Value函数简单分析

    First_Value返回结果集中某列第一条数据的值,跟TOP 1效果一样,比较简单的一个函数 先贴测试用代码 DECLARE @TestData TABLE( ID INT IDENTITY(1,1), Department VARCHAR(20), LastName VARCHAR(20), Rate FLOAT ) INSERT INTO @TestData(Department,LastName,Rate) SELECT 'Document Control','Arifin',17.78

  • PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解

    [PHP Source Code]: 复制代码 代码如下: $dbh = new PDO('sqlsrv:server=连接地址;Database=数据库名', 用户名, 密码);try { $procName = "P_Test_GetMixData"; $stmt = $dbh->prepare("EXEC $procName ?, ?, ?"); $nReturnValue = 0; $strReturnValue = ""; $st

  • SQL Server的FileStream和FileTable深入剖析

    互联网时代数据是爆炸式增长,我们常常需要把结构化数据和非结构化数据(如文档,演示文稿,视频,音频,图像)存储在一起.通常有几种方案: 1.在数据库中存储结构化数据,在文件系统中存储非结构化数据,然后数据库里有一个字段记录文件系统的路径,虽然这种方法成本合算,但它引入了额外的复杂度,因为你需要手动去保证跨关系和非关系系统管理事务的完整性. 2.将结构化数据和非结构化数据都存储在数据库中,多年以来,数据库一直都支持存储非关系数据,如二进制大对象,或BLOB,SQL Server称之为varbinar

  • SQL Server 2008中的FileStream介绍

    很多朋友并不知道FileStream 这个功能.因为FileStream 一般在安装的时候默认是不启用的,在SQL Server 2008中,引入了Filestream,使用它可以将非机构化大型数据(如文本文档.图像和视频)等以varbinary(max)的形式存储在文件系统中.使用数据库的备份还原功能可以将这些数据一起备份还原. 在选择数据库文件路径那个窗口,有一个标签是"FileStream".如果在安装的时候你没有启用,安装后可以通过以下设置来开启FileStream 功能. 1

  • SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它

    误区 #18:如下多个有关FileStream的误区 全部错误 18 a)FileStream数据可以在远程存储 不能,由于FileStream数据容器(指的是存放FileStream文件的NTFS文件夹,杜撰出来的术语)必须像数据文件或日志文件那样符合本地存储策略-也就是说,这个数据容器必须放在对于运行SQL Server的Windows Server是本地存储(译者注:也就是在'计算机'里能看到的存储,DAC当然是了,其实SAN这类不直接连接服务器的也算是)访问FileStream数据只要客

  • SQL Server FileStream详解

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

  • SQL Server在AlwaysOn中使用内存表的“踩坑”记录

    前言 最近因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧. 数据库:SQL Server2014 Enterprise Edition (64-bit) 删除文件 使用一个单独非alwayson环境的数据库测试. 一.创建内存表 ---创建内存表文件组 ALTER

  • SQL server 2008 数据安全(备份和恢复数据库)

    下边是我对部分内容的总结,里边偏向了T-SQL语句实现的总结,对于SQL Server Management Studio中对象管理器的操作并没有太多的总结,因为这些都有一些向导,而且,大部分都是在对应的节点,右击找相应的操作,相应的对象,然后根基向导去操作! 首先是大概知识点的总结: 下边是一些T-SQL语句对应的总结,1,管理备份设备的语句: 2,备份的语句: 3,数据恢复的对应语句: 最后, 上边讲到了备份有完全备份,差异备份,事务日志备份和文件组和数据文件备份,恢复有简单恢复,简单恢复,

  • C#将图片存放到SQL SERVER数据库中的方法

    本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: //获取当前选择的图片 this.pictureBox1.Image = Image.FromStream(this.openFileDialog1.OpenFile()); //获取当前图片的路径 string path = openFileDialog1.FileName.ToString(); //将制定路径的图片添加到FileStream类中 FileStream fs = ne

  • SQL Server使用游标处理Tempdb究极竞争-DBA问题-程序员必知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点使其在一定场景下替代临时表/表变量对象,解决深层次的tempdb竞争问题. 在抛出这个不可避免的问题之前我们先简要看下什么是tempdb竞争. 我们拿SQL Server创建一个临时表的过程来描述 1 在系统表中创建表的条目(系统数据页中) 2 分配一个IAM页并找到一个混合区在PFS页中标记 3

  • SQL Server 数据库备份和还原认识和总结(二)

    通过<SQL Server 数据库备份和还原认识和总结(一)>,相信您对数据备份和还原有了一个更深入的认识,在上文中我没有对事务日志做剖析,在此推荐宋沄剑的文章,对事务日志做了比较详细的讲解:http://www.jb51.net/article/31038.htm.本文将针对上文继续进行数据备份和还原讲解,主要讲解备份和还原的一些关键选项. 数据库备份选项 备份数据库时,有几个备份选项需要了解一下,覆盖介质.事务日志等.谈到覆盖介质时,必须先对这个概念有所了解,不然无从谈起. ● 介质集 (

随机推荐