互联网时代数据是爆炸式增长,我们常常需要把结构化数据和非结构化数据(如文档,演示文稿,视频,音频,图像)存储在一起。通常有几种方案:
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中的事务访问这些文件。