【问题标题】:Retrieve all images at once or individually from SQL Server从 SQL Server 一次或单独检索所有图像
【发布时间】:2015-10-01 21:28:17
【问题描述】:

我有许多图像在数据库中存储为VARBINARY(MAX)(使用 FileStream)。我希望一次检索大约 10 张左右的图像。

使用 ASP.net 的规定、最常见的方法是使用 HTTP 处理程序并为每个单独的图像访问数据库。看起来不错,但有时有点慢。

最好在一个大数据块中同时下载给定页面的所有图像吗?还是我应该尝试单独抓住每个?最佳做法?

【问题讨论】:

    标签: c# asp.net sql-server database


    【解决方案1】:

    最好在没有设置 cookie 的域上单独执行这些操作,或者确保您的处理程序可以同时处理多个请求。这样您就可以同时从数据库中流式传输多个结果,并在获取图像时从您的网络服务器流式传输多个图像。

    【讨论】:

    • 非常有趣..所以处理程序将允许我执行多个同时请求?...您能详细说明一下吗?
    • “一次全部获取”方法有什么缺点吗?
    • @user111222333 根据我的帖子,可能存在诸如 IOP 使用等缺点,但 SQL Server 处理得非常好,并且专为检索大型数据集而设计。在您的情况下,我们谈论的是 10 张图像,这表明开销不会太多。但是,在我看来,同时连接是一个不好的选择,因为 SQL 更喜欢 SET 操作类型(数据集而不是循环)。我建议您运行性能分析器并查看差异。
    • @user111222333 缺点是通过查询这样的大集合,您实际上是单线程请求。在传输第一个图像之前,您无法开始接收第二个图像,并且以最佳方式编写它以便您可以在从数据库接收图像时开始发送图像,而不是等待整个图像集更加困难和复杂。
    • @user111222333 您应该通过实际测试对其进行基准测试,同时考虑客户端/服务器带宽、延迟和工作负载。然后看看每个人在你扩大规模时的反应。即使在一些非常大的网站上,我(还)还没有遇到一次处理单个请求的扩展问题。也就是说,我们依靠 3rd 方代码来处理图像检索和缓存,因为这样做比从头开始编写更具成本效益。目前,我们为此使用来自imageresizing.net 的代码,它还没有让我们失望。
    【解决方案2】:

    嗯,

    我想很多人会有不同的看法,以及对他们来说最佳实践的原因,但实际上,这完全取决于硬件、软件、数据结构以及数据是否被规范化。

    一般来说,SQL Server 更喜欢 SET 操作,这意味着循环通常更慢。但是,对于 IOP 相关的问题,循环更安全,并且它们更擅长导致更少的锁。

    我不确定您使用的是哪个对象映射器或内置 SQL 库(我感觉您可能在构建 SQL 类后使用 LINQ),但这也取决于您使用的库,我肯定会推荐dapper。

    我认为一次阅读它们会更快,这就是原因; - 如果像你说的那样,并且每次都为图像访问数据库,那么这会增加重新连接到数据库的延迟,因此会出现延迟。但是当有一个连接时,数据检索是直接的,并且您的连接在那个时候是打开的,不需要进一步的会话身份验证。

    我建议一次性下载它们,并在下载过程中通过下载屏幕通知最终用户。同样对于检索数据,我相信这个链接非常有帮助:https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

    根据您服务器的功能和版本,您绝对可以使用不同的功能。

    【讨论】:

    • 我正在处理标准化数据。没有 SQL 循环,这将在一个返回 10 个 VARBINARY(MAX) 列的单个 SELECT 语句中完成。另一种方法是单个 SELECT 语句,每个语句都命中数据库等。
    • 我同意你重新连接/延迟的想法。真正的问题是:使用 HTTP 处理程序,在 ASP.net 中执行此操作的唯一真正方法是为每个图像访问数据库。您在查询字符串中向处理程序提供图像 ID,它会访问图像的数据库并获得结果。只是看起来很傻。使用 jQuery/ajax 和 Web 方法,我可以获取所有图像,但编写此代码很痛苦,并且使整个问题复杂化。
    • 对于应该是一个更简单的问题,这真的是闹剧的解决方法。
    • 您能否对其他答案发表评论?
    • 我们在谈论多少张图片?你有ID范围吗?如果您有 ID 范围,只需请求该 ID 范围之间的图像。
    猜你喜欢
    • 2012-03-03
    • 2014-08-22
    • 2016-12-06
    • 1970-01-01
    • 2018-07-22
    • 2012-03-30
    • 1970-01-01
    • 2013-07-25
    • 2021-04-15
    相关资源
    最近更新 更多