这是我所知道的一个老问题,但是使用SQL Server 2012最终可以将文件存储在数据库中,还是应该将它们保存在文件系统中,只在数据库中引用它们?
如果将它们存储在数据库中这些天被认为是可接受的,那么最有效的方法是什么? 我打算应用加密技术,所以我很欣赏处理速度不会很快。
由于
答案 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通常可以提供更好的流式传输性能。