3

巨大な Oracle データベースがあり、SQL Navigator (v5.5) を使用して頻繁にデータを取得しています。ときどき、ボタンをクリックしてコードの実行を停止する必要がありStopます。これは、コードに不足している部分があることに気付いたからです。問題は、Stopボタンをクリックした後、停止プロセスを完了するのに非常に長い時間がかかることです (場合によっては数時間かかることもあります!)。プログラムはStopping...下部のバーに表示され、終了するまで多くの時間を失います。

この背後にある理論的根拠は何ですか? 停止プロセスをスピードアップするにはどうすればよいですか? 念のため、私は管理者ではありません。私は、いくつかのビューを使用してデータベースにアクセスする制限付きユーザーです。

4

2 に答える 2

5

クエリを停止するには、次の 2 つのことが必要です。

  1. クエリをキャンセルすることを実際の Oracle プロセスに通知する必要があります。
  2. クエリが DB (DDL、DML) に変更を加えた場合、作業をロールバックする必要があります。

まず、クエリを実行している Oracle プロセスは、クエリをキャンセルする必要があるかどうかを時々チェックする必要があります。長いタスク (たとえば、大きな HASH JOIN) を実行している場合でも、3 秒ごとにチェックしていると思います (この情報のソースを探しています。見つかったら回答を更新します)。ソフトウェアは Oracle と正しく通信できますか? SLQ Navigator には詳しくありませんが、キャンセル メカニズムは他のツールと同じように機能するはずなので、2 番目のポイントを待っていると思います。

プロセスが動作を停止するように通知されると、このクエリで既に完了したすべてを元に戻す必要があります (Oracle ではすべてのステートメントはアトミックであり、ロールバックせずに途中で停止することはできません)。ほとんどの場合、DML ステートメントでは、ロールバックは既に完了した作業よりも時間がかかります (私は次のように考えています: Oracle は後方ではなく前方に動作するように最適化されています)。この場合 (大きな DML)、ロールバック中は辛抱強く待つ必要があります。プロセスを高速化するためにできることはあまりありません。

クエリが単純な SELECT であり、ツールでキャンセルできない場合は、セッションを強制終了できます (別のセッションからの管理者権限が必要です)。これは瞬時に行われます。

于 2010-10-15T08:52:21.853 に答える
1

クエリをキャンセルすると、OracleクライアントはOCIBreak()を送信する必要がありますが、これはWindowsサーバーに実装されていないため、原因である可能性があります。

また、DBAに。の値をチェックしてもらいますSQLNET.EXPIRE_TIME

于 2010-10-15T19:51:06.313 に答える