在SQL Server中存储文件

这是我所知道的一个老问题,但是对于SQL Server 2012来说,将文件存储在数据库中最终还是可以的,还是应该将它们保存在文件系统中,只在数据库中引用它们?

如果现在把它们存入数据库被认为是可以接受的,那么最有效的方法是什么? 我打算申请encryption,所以我感谢处理不会闪电般快速。

谢谢

微软研究院的一篇很好的论文称为“Blob or Not To Blob” 。

经过大量的性能testing和分析得出的结论是:

  • 如果您的图片或文档的大小通常小于256K,则将其存储在数据库VARBINARY列中效率更高

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

  • 在这两者之间,这取决于你的使用情况,这有点夸张

如果您决定将图片放入SQL Server表中,我强烈build议使用单独的表来存储这些图片 – 不要将员工照片存储在员工表中 – 将它们保存在单独的表中。 这样一来,员工表就可以保持精简并意味着高效,假设您并不总是需要select员工照片作为查询的一部分。

对于文件组,请查看文件和文件组结构以了解介绍。 基本上,您可以从一开始就为大数据结构创build一个单独的文件组的数据库,或者稍后添加一个额外的文件组。 我们称之为“LARGE_DATA”。

现在,只要你有一个新的表来创build哪些需要存储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介绍,并玩弄它!

仍然没有简单的答案。 这取决于你的情况。 MSDN有帮助您决定的文档。

这里还有其他的select。 而不是直接存储在文件系统或BLOB中,你可以使用SQL Server 2012中的FileStream或File Table。File Table的好处看起来像是一个没有智慧的(但是我承认我没有个人的第一手经验。)

这篇文章绝对值得一读。

您可能会阅读FILESTREAM 。 以下是应该帮助您决定的文档中的一些信息:

如果以下条件成立,则应考虑使用FILESTREAM:

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

对于较小的对象,在数据库中存储varbinary(max)BLOB通常会提供更好的stream式处理性能。