我知道这是一个老问题,但是使用SQL Server 2012最终可以将文件存储在数据库中,还是应该仅在数据库中引用文件的情况下将它们真正保留在文件系统中?
如果如今将它们存储在数据库中被认为可以接受,那么最有效的方法是什么?
我打算应用加密,因此我希望处理不会很快。
我知道这是一个老问题,但是使用SQL Server 2012最终可以将文件存储在数据库中,还是应该仅在数据库中引用文件的情况下将它们真正保留在文件系统中?
如果如今将它们存储在数据库中被认为可以接受,那么最有效的方法是什么?
我打算应用加密,因此我希望处理不会很快。
Answers:
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简介,并试用它!
VARBINARY(MAX)
在单独的文件组中,如果您有单独的“文件”表,您是将整个表存储在单独的文件组中,还是将文件“元”数据存储在标准文件组中,然后仅存储VARBINARY(MAX)
在新的文件组?
FILETABLE
SQL Server 2012中的功能?在那里,只有有关文件的元数据存储在SQL Server中(与相似FILESTREAM
)-实际文件(组成文件的字节)存储在数据库外部的磁盘驱动器上
有还是没有简单的答案。这取决于您的情况。 MSDN提供了可帮助您做出决定的文档。
这里还有其他选项。可以直接在SQL Server 2012中使用FileStream或File Table,而不是直接存储在文件系统中或BLOB中。File Table的优点似乎很简单(但是我承认我对它们没有亲身的经验)
这篇文章绝对值得一读。
您可能会阅读FILESTREAM。这是一些来自文档的信息,可以帮助您做出决定:
如果满足以下条件,则应考虑使用FILESTREAM:
- 平均而言,要存储的对象大于1 MB。
- 快速读取访问很重要。
- 您正在开发使用中间层作为应用程序逻辑的应用程序。
对于较小的对象,在数据库中存储varbinary(max)BLOB通常可以提供更好的流传输性能。