如何检索oracle sql查询的进度?

Posted

技术标签:

【中文标题】如何检索oracle sql查询的进度?【英文标题】:How to retrieve the progress of oracle sql query? 【发布时间】:2020-01-05 01:50:51 【问题描述】:

我有一个无法解决的编码问题。

要求是显示 sql 查询的进度。我正在使用 Spring Boot 和 Angularjs,所以想法是向 UI 显示 sql 的进度,不需要实时,但首选。基本上用户点击 UI 上的按钮,它会触发 API 从 db 中检索数据,然后将完成的数据返回给 UI。

我们有一个计算量很大的 sql,需要很长时间才能完成。当我们要检索的行大约为 1000 万时,大约需要 15 分钟。我们想显示 SQL 的进度,以便用户知道需要多长时间。所以想法是检查完成了多少行:

假设检索到 100 万,那么它应该返回 10%,依此类推。接下来是 100 万,然后是 20%。

我不知道如何解决这个问题。需要一些建议。

提前致谢。

【问题讨论】:

所以这只是一个正在运行的大查询?不是一些带有循环之类的 pl/sql 代码吗? 感谢游戏吴。这是一个查询(只读),还是在做 DML——一个更新?你能告诉我——这在成本和性能方面是否稳定/可靠,或者不同的参数(显着地)改变了执行计划?谢谢 如果 DML 则进度显示在事务表 v$transaction 中。 ***.com/questions/54215043/… 这仅适用于一个特定的 SQL,还是适用于任何类型的 SQL 语句?如果这仅适用于一个语句,您可以根据您对查询的了解创建一些估计值。但是,如果您正在寻找一个通用程序来估计任何查询的完成,那么该任务就是theoretically impossible。 感谢游戏吴。由于这是一个选择,我希望物化/缓存可以被视为冗长的临时查询的潜在替代方案,但假设这是不可行的,我会认为类似于@JonHeller - 因为这是一个单个语句,您应该能够在其参数范围(动态采样等)上对其进行分析。有了该配置文件,您可以点击 V$_SQL_MONITOR (或 V$_SQL_PLAN_MONITOR )来衡量进度百分比。或者如果它非常稳定,你可以估计。 【参考方案1】:

谢谢大家。我尝试使用 OldProgrammer 的解决方案,但没有这样做。不知何故,我无法检索 Hibernate sesison ID,而且我发现的所有相关帖子要么太旧,要么只是手动创建我不想要的新会话。

我解决了这个问题,但不是解决方案。

所以我对那个复杂的 SQL 所做的是,首先我做了总计数,然后将它分成 100 个块。然后随着每个块完成(分页),我将更新完成百分比。同时,在 UI 上,我将有时间间隔从不同的 API 端点检查此 SQL 的进度,目前我将其设置为每 2 秒。

所以结果是这样的,对于相当少量的行,每次 API 调用它会从 2% 跃升至 6%;对于大额,只有经过几次 API 进度检查后,才会从 1% 下降到 2%。

这不是一个干净的解决方案,但它达到了它的目的,它会让用户知道需要多长时间才能完成。

【讨论】:

【参考方案2】:

假设这是一个长时间的选择调用,您可以运行以下查询来获取长时间运行语句的统计信息:

select  * from v$session_longops  where time_remaining > 0 and sid = ???

sid 值应替换为运行长查询的会话的 oracle 会话 ID。您可以通过查看 v$session 来确定。您将需要在单独的线程中执行上述查询(或者在 spring 中的任何并发执行单元)。

【讨论】:

谢谢,我会试一试看看。会及时通知您。 我已经提出了我的解决方案。请检查一下。如果您有任何问题,请留下 cmets。

以上是关于如何检索oracle sql查询的进度?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高sql2000全文检索搜索效率

oracle的查询数据(检索数据)

Oracle SQL查询:根据时间检索每组的最新值[重复]

基于字符串模式检索父记录的 Oracle SQL 查询

Linq 查询可以从 Sql 数据库中检索 BLOB 吗?

如何查看SqlServer查询语句的执行效率