【问题标题】:Progressbar in SQLSQL中的进度条
【发布时间】:2015-10-02 10:05:12
【问题描述】:

所以我了解到,为 SQL 查询创建进度条并不是一件容易的事。因此,我尝试提出一种替代解决方案来指示何时完成任务。我想我可以计算在数据库中执行一个查询需要多长时间,然后根据必须执行的查询数量使用该信息创建一个估计值,然后根据该信息创建一个进度条。我知道这不是一个 100% 可靠的解决方案,因为如果出现问题,它仍然会显示进度条,但它至少会给用户一些指示何时完成工作,而不仅仅是一个加载微调器。

这个问题有更好的解决方案吗?

编辑回答一些问题

需要时间的是更新功能。我在数据库中可能有 15.000 个输入,我必须通过 API 更新所有 15.000 个。所以首先我必须提取所有这些的 id 并将它们与 API 一起使用以获取更新的信息,然后我必须使用更新的信息执行所有 15.000 个查询。这一切都需要时间。我怀疑它可以很快完成。使用包含 15.000 个查询的数据库,我花了大约 2 个小时。我不相信 2 小时内没有指示何时完成的微调器是可行的。我需要某种估计。

请注意,很少会更新数据库。就像用户可能每周更新一次数据库一样。

【问题讨论】:

  • 我想你已经看过这个stackoverflow.com/a/617271/2042240
  • 你自己说的 - 这不是一个可靠的解决方案。让用户知道任务正在执行并简单地表明它正在进行中不是更好吗?进度条只会让用户感到困惑,而且要让它正常工作需要大量的工作。您甚至无法估计查询可能需要多长时间。我只需要创建一个视觉通知程序,表明某事已完成,而无需锁定整个 UI。
  • 有更好的解决方案吗?好吧,如果我发现自己在考虑 SQL 查询的进度条,我会从优化我的查询开始。显然,他们目前的速度太慢了。使用EXPLAIN … 找出瓶颈所在。
  • feeela 和 Mjh。我已经用你的问题的答案更新了问题
  • 15 000 个查询并不多,它可以改进,可能是从拉取和更新数据方面(但是,没有关于这部分的信息,所以我们不能建议)。你无法估计需要多长时间——这根本不可能,而且总是不准确——人们会为此烦恼。您可以将任务拆分为块。如果您有 15 000 条记录,则以 150 条为一组进行处理。每 150 条已处理 = 1%。每次处理 150 时,发回有关更新的信息并推进进度条。

标签: javascript sql progress


【解决方案1】:

您可以使用 reverse-ajax,然后将结果返回到 iframe。

在服务器端,当一个迭代步骤完成时,使用 repsonse.flush (ASP.NET) 向客户端获取部分结果。

输出 JavaScript 代码如:

window.parent.fnReportProgress(25.3)

另外,请确保您不会更新每条进度消息。 而是将消息存储在一个数组中,然后每 x 毫秒 (setInterval) 轮询一次数组,直到完成。如果不将所有消息放入数组中,而是立即更新进度条,则会在 IE 中出现蓝屏,并且仅在 IE 中。 Chrome + FF 工作得非常好。

如果你只需要在半现代服务器(IIS 8+)上支持半现代浏览器(IE10+),你也可以使用WebSockets。

WebSockets 也可以在服务器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多