2

Oracle 10g の INSERT クエリが、「dblink からの SQL*Net メッセージ」イベントでスタックしています。次のようになります。

INSERT INTO my_table (A, B, C, ...) 
  SELECT A, B, C, ... FROM link_table@other_system;

my_table私がやろうとしている INSERT からのロック以外にロックが表示されません。の SELECT クエリはlink_table@other_system、単独で実行すると問題なく完了します。この問題は、INSERT を実行しようとしたときにのみ発生します。

ここで何が起こっているのか知っている人はいますか?

UPDATE SELECT を単独で実行すると、約 1.5 分で 4857 行が返されます。INSERT は、私が強制終了する前に、この待機メッセージで 1 時間以上実行されていました。

更新 メソッドにエラーが見つかりました。結果を制限するために日付範囲を使用していました。SELECT のみをテストするときに使用した日付範囲は、link_table で最後に OraStats を実行する前でしたが、INSERT をテストするときに使用した日付範囲は、link_table で最後に OraStats を実行した後です。そのため、INSERT に問題があると誤解されてしまいました。これを行うのはあまり科学的ではありません。私の間違い。

4

2 に答える 2

2

SQL*Net message from dblink通常、ローカル システムがネットワーク上でデータをネットワーク経由で転送するのを待っていることを意味します。これは、この種のクエリのごく普通の待機イベントです。

SELECTステートメントは何行を返しますか? それはどのくらいのデータ (MB/GB) を表していますか?

「単体で問題なく完了する」とのことですが、実際にすべてのデータを取得しているのでしょうか。TOAD や SQL Developer などを使用している場合、GUI は通常、最初の N 行をフェッチしてユーザーに返します。これは非常に高速ですが、データベースがクエリの実行を完了したことを意味するものではありません。クエリが返すすべての行の生成を完了するには、さらに時間がかかる場合があります。最後の行をフェッチする時間ではなく、最初の N 行をフェッチするのに必要な時間を測定することは非常に一般的です。INSERT ステートメントは、明らかに、すべての行がリモート テーブルからフェッチされるまで戻ることができません。

于 2012-06-20T19:54:28.513 に答える
2

ヒントを使用し/*+ driving_site(link_table) */て、リモート サーバーで Oracle に結合を実行させていますか?

その場合、このページでジョナサン・ルイスが説明しているように、そのヒントはDML では機能しません

SELECTこれは、 の一部としてクエリを実行するのとはまったく異なるプランを使用して、としてクエリを実行するまれなケースである可能性がありますINSERT。(ご使用の環境で説明計画を生成する方法を学びたいと思うことは間違いありません。ほとんどのツールには、これを行うためのボタンがあります。)

Andras Gabor がリンクで推奨しているように、PL/SQL を使用BULK COLLECTしてパフォーマンスを向上させることができます。これは、PL/SQL が SQL よりも高速に動作するまれなケースである可能性があります。

于 2012-06-22T04:42:13.890 に答える