10

私は、Oracle データベースを使用する Web アプリの開発者です。ただし、多くの場合、UI は処理に時間がかかるデータベース操作をトリガーします。その結果、クライアントは、これらの状況が発生したときに進行状況バーを必要とします。

私は最近、2 番目の接続から V$SESSION_LONGOPS を照会できることを発見しました。これは素晴らしいことですが、6 秒以上かかる操作でしか機能しません。これは、6 秒が経過するまで UI の進行状況バーを更新できないことを意味します。

V$SESSION での待機時間について調査しましたが、私が見た限りでは、クエリの待機時間は含まれていません。

セッションの現在実行中のクエリの進行状況を取得する方法はありますか? または、6 秒が経過するまでプログレス バーを非表示にする必要がありますか?

4

4 に答える 4

9

これらの操作は Pl/SQL 呼び出しですか、それとも長時間実行される SQL ですか?

PL/SQL 操作を使用するとSET_SESSION_LONGOPS()DBMS_APPLICATION_INFOパッケージにメッセージを書き込むことができます。これらのメッセージは で監視できますV$SESSION_LONGOPS詳細をご覧ください

これが機能するには、操作を作業単位で定量化できる必要があります。これらは具体的な何かの繰り返しでなければならず、時間ではありません。したがって、操作が10000行を挿入する場合、それを10バッチに分割できます。パラメータはtotalworkバッチ数 (つまり10) であり、1000 行ごとに SET_SESSION_LONGOPS() を呼び出してsofarパラメータをインクリメントします。これにより、10 個のブロックの温度計をレンダリングできます。

これらのメッセージはセッションベースですが、同じセッションおよび SID からの以前のメッセージと現在のメッセージを自動的に区別する方法はありません。ただし、パラメータに UID を割り当てると、contextその値を使用してビューをフィルタリングできます。


クエリをチャンクに分割する方法がないため、これは単一の長時間実行クエリでは機能しません。

于 2013-04-11T06:16:44.637 に答える