【发布时间】: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中。 stackoverflow.com/questions/54215043/… -
这仅适用于一个特定的 SQL,还是适用于任何类型的 SQL 语句?如果这仅适用于一个语句,您可以根据您对查询的了解创建一些估计值。但是,如果您正在寻找一个通用程序来估计任何查询的完成,那么该任务就是theoretically impossible。
-
感谢游戏吴。由于这是一个选择,我希望物化/缓存可以被视为冗长的临时查询的潜在替代方案,但假设这是不可行的,我会认为类似于@JonHeller - 因为这是一个单个语句,您应该能够在其参数范围(动态采样等)上对其进行分析。有了该配置文件,您可以点击 V$_SQL_MONITOR (或 V$_SQL_PLAN_MONITOR )来衡量进度百分比。或者如果它非常稳定,你可以估计。
标签: angularjs oracle spring-boot spring-data-jpa