在SQL Server中存储文件


80

我知道这是一个老问题,但是使用SQL Server 2012最终可以将文件存储在数据库中,还是应该仅在数据库中引用文件的情况下将它们真正保留在文件系统中?

如果如今将它们存储在数据库中被认为可以接受,那么最有效的方法是什么?

我打算应用加密,因此我希望处理不会很快。


6
不知道我是否愿意。我只想知道现在是否可行。
CompanyDroneFromSector7G 2012年

Answers:


116

Microsoft Research的一篇非常好的论文叫做To Blob或Not To Blob

经过大量的性能测试和分析,他们的结论是:

  • 如果您的图片或文档通常小于256K,则将它们存储在数据库VARBINARY列中会更有效

  • 如果您的图片或文档的大小通常超过1 MB,则将它们存储在文件系统中的效率更高(并且使用SQL Server 2008的FILESTREAM属性,它们仍受事务控制并且属于数据库的一部分)

  • 在这两者之间,取决于您的使用情况,有些折腾

如果您决定将图片放入SQL Server表中,我强烈建议使用一个单独的表来存储这些图片-不要将员工照片存储在employee表中-请将它们保存在单独的表中。这样,假设您并不需要总是选择员工的照片作为查询的一部分,那么Employee表就可以保持精简,卑鄙和高效。

对于文件组,请检查文件和文件组体系结构”以获取简介。基本上,您可以从一开始就为大型数据结构使用单独的文件组创建数据库,或者稍后再添加其他文件组。我们称之为“ LARGE_DATA”。

现在,只要您有一个新表要创建,该表需要存储VARCHAR(MAX)或VARBINARY(MAX)列,就可以为大数据指定此文件组:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

查看有关文件组的MSDN简介,并试用它!


1
说得好。当然,这完全取决于用例,但是文件流通常是一个不错的选择。
TimothyAWiseman

3
您引用的研究文章是2006年4月的。自那以后,肯定有很多事情发生了变化。
奥克森2014年

2
@ 1576573987:不,不是真的-这些结论仍然是有效的,据我可以告诉
marc_s

关于存储VARBINARY(MAX)在单独的文件组中,如果您有单独的“文件”表,您是将整个表存储在单独的文件组中,还是将文件“元”数据存储在标准文件组中,然后仅存储VARBINARY(MAX)在新的文件组?
RemarkLima 2014年

@RemarkLima:您是否在谈论FILETABLESQL Server 2012中的功能?在那里,只有有关文件的元数据存储在SQL Server中(与相似FILESTREAM)-实际文件(组成文件的字节)存储在数据库外部的磁盘驱动器上
marc_s 2014年

29

还是没有简单的答案。这取决于您的情况。 MSDN提供了可帮助您做出决定的文档。

这里还有其他选项。可以直接在SQL Server 2012中使用FileStream或File Table,而不是直接存储在文件系统中或BLOB中。File Table的优点似乎很简单(但是我承认我对它们没有亲身的经验)

这篇文章绝对值得一读。


11

您可能会阅读FILESTREAM。这是一些来自文档的信息,可以帮助您做出决定:

如果满足以下条件,则应考虑使用FILESTREAM:

  • 平均而言,要存储的对象大于1 MB。
  • 快速读取访问很重要。
  • 您正在开发使用中间层作为应用程序逻辑的应用程序。

对于较小的对象,在数据库中存储varbinary(max)BLOB通常可以提供更好的流传输性能。


实际上,根据文件大小,我可以两者兼而有之。谢谢!
CompanyDroneFromSector7G 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.