如何检索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查询的进度?的主要内容,如果未能解决你的问题,请参考以下文章