在SQL Server中存储文件

时间:2012-11-16 16:14:14

标签: sql-server

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

如果将它们存储在数据库中这些天被认为是可接受的,那么最有效的方法是什么? 我打算应用加密技术,所以我很欣赏处理速度不会很快。

由于

3 个答案:

答案 0 :(得分:100)

微软研究院的一篇非常好的论文名为To Blob or Not To Blob

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

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

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

  • 介于这两者之间,取决于您的使用情况,这是一个小小的挑战

如果您决定将图片放入SQL Server表格,我强烈建议您使用单独的表格存储这些图片 - 不要将员工照片存储在员工表格中 - 将它们保存在单独的表格中。这样,员工表可以保持精简,平均且高效,假设您不总是需要选择员工照片作为查询的一部分。

对于文件组,请查看Files and Filegroup Architecture以获取简介。基本上,您可以从一开始就为大型数据结构创建具有单独文件组的数据库,或者稍后添加其他文件组。我们称之为“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 :(得分:23)

仍然 没有简单的答案。这取决于您的情况。 MSDN has documentation to help you decide.

此处还介绍了其他选项。您可以使用SQL Server 2012中的FileStream或File Table,而不是直接或在BLOB中存储文件系统。文件表的优势看起来像是一个没有脑子的人(但不可否认,我没有个人的第一手经验。)

这篇文章绝对值得一读。

答案 2 :(得分:10)

您可以阅读FILESTREAM。以下是文档中可以帮助您做出决定的一些信息:

  

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

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

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