如果我在SQL Server 2012中创建一个FileTable,然后将一个4G文件放到NT文件系统(即文件流中),那么将整个4G文件读入表的文件流列吗?
SQL实际上是否正在制作我的4G文件的副本?或者文件流列是否代表我的4G文件的指针,它开始在查询中读取?
我只想弄清楚我是否将100G数据添加到我的文件系统中,是否会为我的数据库添加100G的数据大小。
有人可以帮忙解释一下这是如何运作的吗?甚至更好地指出一些比MS / MSDN“如何做”更详细的文档?
编辑:有趣的是 - 如果我在FT目录中删除1G文件,然后选择file_stream列包含该文件的所有数据(我认为)。但是,如果我在放入该文件之前和之后sp_spaceused FileTableTb
,表大小不会改变。也许这证明select选择打开文件流并将其读入,但除此之外数据不存储在表中?
答案 0 :(得分:4)
你是对的,数据不是存储在数据库中,而是存储在文件系统本身中,同样重要的是要注意文件放在文件系统上时不会“读入”数据库,这意味着它被复制到另一个位置,它实际上存储为NTFS文件,FileStream API显示文件表中的文件元数据。
文件表是基于SQL 2008中引入的FileStream技术构建的,但允许您通过Windows资源管理器直接修改数据。
创建数据库时,指定其中一个文件组是文件流文件组,这不像普通文件组,实际上是一系列名为Data Containers的NTFS文件夹,这是文件实际存储的位置,你不能直接修改这个文件夹,但是你可以查看内容(不过这里有很多人类可读的东西,你可以在这里找到你的实际文件,如果你看起来很难通过GUID文件夹和奇怪命名的文件:))
用于将文件复制到表中的文件共享实际上是这些数据容器中的数据的表示,这些数据容器通过过滤器驱动程序呈现给Windows资源管理器,该驱动程序使用流API对数据容器进行更改并将行添加到文件表等。