我有一个桌面应用程序需要通过TCP协议上传/下载服务计算机上的图像。
首先,我将图像存储在文件系统中,但我需要在MS SQL DB中比较哪种解决方案更好。图像数量超过五十万。我不知道照片的大小是否会有任何限制。
如果你这样做了,请写下你对这个问题的看法。
哪一个更快,更安全?这些照片中哪一个效果更好?如果我将存储在数据库上,我是否需要存储除了我用于我的应用程序的所有其他表格以及哪种类型更好的图像 - 在DB上的图像或varbinary?等等。
谢谢。
答案 0 :(得分:5)
微软研究院的一篇非常好的论文名为To Blob or Not To Blob。
经过大量的性能测试和分析后得出的结论是:
如果您的图片或文档的大小通常低于256K,则将它们存储在数据库VARBINARY列中效率更高
如果您的图片或文档的大小通常超过1 MB,则将它们存储在文件系统中会更有效(并且使用SQL Server 2008的FILESTREAM属性,它们仍然处于事务控制之下并且是数据库的一部分)< / p>
介于这两者之间,取决于您的使用情况,这是一个小小的挑战
如果您决定将图片放入SQL Server表格,我强烈建议您使用单独的表格存储这些图片 - 不要将员工foto存储在员工表格中 - 将它们保存在单独的表格中。这样,员工表可以保持精简,平均且非常高效,假设您并不总是需要选择员工foto,作为查询的一部分。
对于文件组,请查看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 :(得分:1)
哪个版本的SQL服务器? 2008版本添加了专为此目的而设计的FILESTREAM。 FILESTREAM数据可以位于磁盘上,这使得访问速度非常快。
如果这不是一个选项,您可以考虑为图像数据创建一个单独的文件组(在分区数据时为您提供最大的灵活性)并使用varbinary(max)或图像数据类型。
SQL大师可能会提供更好的信息。