3

在 SQL Server 2008 中存储大量图像数据的最佳做法是什么?我希望使用大约 5 GB 的存储空间来存储大约 50,000 张图像。目前我正在使用包含列的单个表来执行此操作:

ID: int/PK/identity
Picture: Image
Thumbnail: Image
UploadDate: DateTime

我很担心,因为在我预期总容量的 10% 左右,插入似乎需要很长时间。典型的图像约为 20k - 30k。是否有更好的逻辑结构来存储这些数据?或者我是否需要研究集群或其他 IT 解决方案来适应数据负载?

4

3 回答 3

4

DB 还是不 DB,这是个问题。

您正在使用 DB 中的图像在这里开始一场宗教战争。

对于 SQL 2000 的意见会有所不同,但 2005 及更高版本在存储 blob 方面做得相当不错 - 只需查看使用 MS SQL Server 作为存储的 SharePoint 安装数量即可。我只会走这条路线进行次要图像存储。

如果您最终将它们放入数据库中,我会说您应该将图像与与之关联的数据分开,以便于查询和减少您的 IO 和开发人员编写时的实例SELECT *(是的,他们会这样做)。

查看 SQL 2008 中的 FILESTREAM - 它适用于这样的事情。

以下是您可能需要考虑的有关 DB 与文件系统的其他一些要点:

  • 数据库存储、备份、恢复、维护许可费用昂贵
  • 数据库中的存储比磁盘上的存储更难
  • 磁盘可以加速
  • 您需要编写代码来获取/设置数据库中的图像 - 磁盘不需要
于 2009-11-30T15:17:17.463 回答
4

Image是 SQL Server 2008 中已弃用的数据类型。自 SQL Server 2005 以来已被替换为VARBINARY(MAX)。如果您决定将图像存储在 DB 中,则应使用VARBINARY(MAX)字段并考虑添加FILESTREAM选项。

根据这份白皮书,对于流数据,如图像,FILESTREAM比单独的要快得多:VARBINARY(MAX)

文件流与 varbinary(max) 性能
(来源:microsoft.com

请注意,要实现这种流式传输性能,您必须在设计中使用正确的 API 并获取BLOB 的 Win32 句柄。请注意,对FILESTREAM列(包括INSERTS)的更新将比VARBINARY(MAX).

于 2009-11-30T16:31:42.113 回答
2

查看 SQL Server 2008 中的新Filestream功能。本质上,它允许您在数据库中存储 blob(读取:图像)数据,而无需在每次读取和写入时将数据读入 sql 缓冲区的开销。它无缝地使用文件系统来存储您的大文件而不是 sql 页面。这可以为更大的文件带来更快的读写时间,而且最重要的是,由于这一切都发生在幕后,您不需要更改任何现有的存储过程来处理文件流列。有关代码示例和一些性能分析,请参见此处

于 2009-11-30T15:23:36.603 回答