10

我是使用 Oracle 数据库的 Web 应用程序的开发人员。但是,UI 通常会触发需要一段时间才能处理的数据库操作。因此,当这些情况发生时,客户端会想要一个进度条。

我最近发现我可以从第二个连接查询 V$SESSION_LONGOPS,这很棒,但它只适用于耗时超过 6 秒的操作。这意味着我无法更新 UI 中的进度条,直到 6 秒过去。

我已经对 V$SESSION 中的等待时间进行了研究,但据我所知,这不包括等待查询。

有没有办法获取当前正在运行的会话查询的进度?或者我应该隐藏进度条直到 6 秒过去?

4

4 回答 4

9

这些操作是 Pl/SQL 调用还是只是长时间运行的 SQL?

SET_SESSION_LONGOPS()通过 PL/SQL 操作,我们可以在DBMS_APPLICATION_INFO包中写入消息。我们可以在V$SESSION_LONGOPS. 了解更多

为此,您需要能够以工作单元量化操作。这些必须是具体事物的迭代,并且是数字而不是时间。因此,如果操作是插入 10000 行,您可以将其分成 10 个批次。该totalwork参数是批次数(即10),您在每 1000 行之后调用 SET_SESSION_LONGOPS() 以增加该sofar参数。这将允许您渲染一个十块的温度计。

这些消息是基于会话的,但没有自动方法将当前消息与来自相同会话和 SID 的先前消息区分开来。但是,如果您将 UID 分配给context参数,则可以使用该值来过滤视图。


这不适用于单个长时间运行的查询,因为我们无法将其分成块。

于 2013-04-11T06:16:44.637 回答
2

我发现这非常有用

dbms_session.set_module("MY Program" , "Kicking off ... ")
..
dbms_session.set_action("Extracting data ... ")
..
dbms_session.set_action("Transforming data ... ")
..

您可以使用以下方式监控进度

select module , action from v$session where sid = :yoursessionid
于 2013-04-11T07:17:44.697 回答
1

使用 V$_SESSION_LONGOPS 需要设置 TIMED_STATISTICS=true 或 SQL_TRACE=true。您的数据库模式必须被授予 ALTER SESSION 系统权限才能这样做。

我曾经尝试将 V$_SESSION_LONGOPS 用于复杂且长时间运行的查询。但事实证明 V$_SESSION_LONGOPS 可能会显示部分查询的进度,例如全表扫描、连接操作等。

另见:http ://www.dba-oracle.com/t_v_dollar_session_longops.htm

您可以做的只是向用户显示“查询仍在运行”。我实现了一个<DIV>嵌套到 a<TD>中,随着浏览器发送的每个状态请求而变得更长。状态请求由window.SetTimeout(每 3 秒)发起,是对服务器端过程的 AJAX 调用。服务器端过程返回的状态报告只是说“我们仍在运行”。进度条的宽度(即<DIV>' 的宽度)<TD>每次以 s 宽度的 5% 递增,显示 100% 后重置为 5%。

对于长时间运行的查询,您可能会在单独的表中跟踪它们所花费的时间,可能带有用于不同 where 子句的单独条目。您可以使用它在客户端对话框中显示平均时间加上刚刚过去的时间。

如果您在服务器端有一个长时间运行的 PL/SQL 过程或类似的程序执行几个步骤,请尝试以下操作:

  • 为状态消息创建表
  • 为用户启动的任何进程使用唯一键。建议:客户端的javascript日期(以毫秒为单位)+会话ID。
  • 如果要通过浏览器窗口中的链接启动长时间运行的过程,请使用 DBMS_JOB.SUBMIT 创建一个作业来运行该过程,而不是直接运行该过程
  • 使用 PRAGMA AUTONOMOUS_TRANSACTION 编写一个更新状态表的简短过程。此 pragma 允许您提交对状态表的更新,而无需提交主过程的更新。主过程的每个主要步骤都应在此状态表中具有自己的条目。
  • 编写程序查询浏览器调用的状态表
  • 如果用户单击“取消”或关闭窗口,则编写一个由 AJAX 调用调用的过程
  • 编写一个在每个步骤完成后由主过程调用的过程:它查询状态表并引发异常,如果设置了取消标志或浏览器没有查询状态,则为 20,000 秒,例如, 60 秒。在主过程的异常处理程序中查找此错误,执行回滚并更新状态表。
于 2015-03-01T19:03:46.290 回答
1

这些年来,我做了很多 Web 开发,Oracle发现大多数用户更喜欢不确定的进度条,而不是不准确的确定进度条(几乎所有Microsoft's让我烦恼的进度条),不幸的是没有可靠的方法可以准确地确定查询进度。

虽然您对长操作能力的研究令人钦佩,并且肯定有助于使数据库查询的进度更加可靠,但它不能考虑可能/将影响 Web 操作的事务进度​​(网络负载)的无数其他变量、数据库负载、应用服务器负载、客户端数据解析、用户点击提交按钮 1000 次等)。

我会坚持使用 Javascript 回调的不确定进度方法。它更容易实现,并且会根据需要管理用户的期望。

于 2013-04-11T03:54:48.930 回答