3

あるテーブルから別のテーブルへの一括データの連続的なログ挿入を行いたいと考えています。これはデータ移行の一部として 1 回限りであるため、パーティションの交換などは解決策ではありません。

SQL は次の構造になります。

INSERT /*+ APPEND */ ... SELECT FROM ....

Oracle がこれをダイレクト パス挿入ではなく従来の挿入で実行する原因は何ですか?

たとえば、テーブルにトリガーを設定すると、Oracle が通常の挿入を実行するようになると思います。制限の決定的なリストはありますか?

4

1 に答える 1

6

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484からの引用 :

「insert/* + append * /は、テーブルに参照整合性またはトリガーがある場合、追加ヒントを無視し、従来のパスロードを使用します...」-Tom Kyte

https://docs.oracle.com/cd/E18283_01/server.112/e17118/statements_9014.htm#sthref6486から

ダイレクトパスINSERTには、いくつかの制限があります。これらの制限のいずれかに違反した場合、特に明記されていない限り、OracleDatabaseはメッセージを返さずに従来のINSERTをシリアルに実行します。

  • 他のDMLステートメントの有無にかかわらず、1つのトランザクションに複数のダイレクトパスINSERTステートメントを含めることができます。ただし、1つのDMLステートメントが特定のテーブル、パーティション、またはインデックスを変更すると、トランザクション内の他のDMLステートメントはそのテーブル、パーティション、またはインデックスにアクセスできなくなります。

  • 同じ表、パーティション、または索引にアクセスする照会は、直接パスのINSERTステートメントの前では許可されますが、後では許可されません。

  • シリアルまたはパラレルステートメントが、同じトランザクションでダイレクトパスINSERTによってすでに変更されているテーブルにアクセスしようとすると、データベースはエラーを返し、ステートメントを拒否します。

  • ターゲットテーブルをクラスターにすることはできません。

  • ターゲットテーブルにオブジェクトタイプの列を含めることはできません。

  • ダイレクトパスINSERTは、パーティション化されていない場合、マッピングテーブルがある場合、またはマテリアライズドビューによって参照されている場合、インデックス編成テーブル(IOT)ではサポートされません。

  • インデックス編成テーブル(IOT)の単一パーティションまたは1つのパーティションのみを持つパーティションIOTへのダイレクトパスINSERTは、IOTが並列モードで作成された場合、またはAPPENDまたはAPPEND_VALUESヒントを指定した場合でも、シリアルに実行されます。 。ただし、パーティション拡張された名前が使用されておらず、IOTに複数のパーティションがある限り、パーティション化されたIOTへのダイレクトパスINSERT操作はパラレルモードを尊重します。

  • ターゲットテーブルには、トリガーまたは参照整合性制約を定義することはできません。

  • ターゲットテーブルを複製できません。

  • ダイレクトパスINSERTステートメントを含むトランザクションは、分散することも分散させることもできません。

ただし、マニュアルのリストは完全ではなく、完全に正確ではありません。たとえば、参照整合性制約は、その制約が参照パーティショニングの一部である場合、ダイレクトパスINSERTをブロックしません

于 2012-04-20T02:47:06.657 に答える