【问题标题】:Working with images in WCF在 WCF 中处理图像
【发布时间】:2010-03-18 14:34:05
【问题描述】:

我有一个桌面应用程序需要通过 TCP 协议向服务计算机上传/下载图像。

起初,我将图像存储在文件系统中,但我需要在 MS SQL DB 中比较哪种解决方案更好。图像数量超过一百万。我还不知道对照片的大小有任何限制。

如果你做过这样的事情,请写下你对这个问题的看法。

哪个更快、更安全?他们中的哪一个更适合这种数量的照片?如果我将存储在 DB 上,我是否需要将图像与我用于我的应用程序的所有其他表分开存储,并且哪种类型效果更好 - 图像或 varbinary 在 DB 上?..等等。

谢谢。

【问题讨论】:

    标签: sql-server wcf image filesystems


    【解决方案1】:

    微软研究院有一篇非常好的论文,叫做To Blob or Not To Blob

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

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

    • 1234563 /p>
    • 在这两者之间,根据你的使用情况有点折腾

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

    对于文件组,请查看 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 介绍,并尝试使用它!

    【讨论】:

    • @marc_s 感谢 Marc 的文章。我认为照片将介于 256Kb 和 1Mb 之间。我在单独的表上测试,但我也想知道,也许我需要一个单独的数据库(不仅仅是表)?
    • @hgulyan:不,单独的数据库不会有太大帮助。首先尝试单独的表,然后可能是单独的文件组(以及磁盘上的文件)。我认为将这些图片放在一个单独的数据库中没有任何好处。
    • @marc_s:好的,我只是认为使用单独的数据库可能会更好地进行备份,并且我已经阅读过存储大量数据会导致整个 sql server 工作速度变慢。是这样吗?您能否提供有关如何在 sql server 中使用文件组的任何信息? :)
    • @hgulyan:是的,在同一个表中混合“常规”数据和大 blob 可能会造成伤害,因为当您在表上执行“SELECT *”时,您总是会取回所有数据,包括图片。如果你把它放在一个单独的表中,你不应该有任何这些问题。
    • 那么这个单独的表中的大量数据不会影响整个数据库的性能吗?谢谢你的详细回答。它真的帮了我很多。是时候尝试一下了。
    【解决方案2】:

    哪个版本的 SQL Server? 2008 版添加了专门为此目的设计的FILESTREAM。 FILESTREAM 数据可以位于磁盘上,因此访问速度非常快。

    如果这不是一个选项,您可以考虑为您的图像数据创建一个单独的文件组(以便在对数据进行分区时为您提供最大的灵活性)并使用 varbinary(max) 或图像数据类型。

    SQL 专家可能会提供更好的信息。

    【讨论】:

    • 您回答错误。但要回答您的问题,您可以在同一个数据库中创建一个单独的表,但使用不同的 filegroup 这意味着数据物理存储在一个单独的文件中。应该与拥有单独的数据库具有相同的好处,但更易于使用。
    • @ArsenMkrt 我已经阅读过,但我有一个问题,如果我将路径存储在数据库中并在文件系统中存储文件,我们怎么知道该表中有一行,你总能找到引用的文件吗?谢谢你的例子。
    • 抱歉,我是新手,我现在知道了 :) 我想我必须尝试使用​​文件流。现在服务器是 2005,但我们正在测试 2008 新应用程序,所以稍后我们将传递给 sql server 2008。嗯..有趣,我不知道,您可以在 db 中使用单独的文件组吗?我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多