1

単一のトランザクションで、5 行をテーブルに挿入しています。行を挿入する前に、クエリを実行して、挿入しようとしているキーを持つ行が既に存在するかどうかを確認します。

私が見ているのは、キーが存在することを確認するクエリがトランザクション内で非常に遅くなるということですが、別のトランザクションからは高速であり、次のトランザクションでは高速です。

私が処理しているリクエストは単一のトランザクションである必要があるため、この作業を小さなトランザクションに分割することはできません。

このトランザクションで選択クエリを高速化するためにできることはありますか?

4

2 に答える 2

0

何百万ものレコードを挿入する場合、最初に増分コミットを行うことです。これは、一時スペースの断片化または制限に達して速度が低下する可能性があるためです。これはbegin endブロックでも実行できます。これにより、次の方法でインデックスを追加できます

create index b indexName on table_name(col1, col2, col3);

以前の回答が述べているように、マージはより高速です。 または、すべての無視する重複を追加してから、重複を削除します。これは、たとえば次の方法
で実行できます

begin
    insert into table_name select * from table_name; [ if pulling from another table]or[use values and column maps]
    delete from table_name A where rowid >(select min(rowid) from table_name B where A.key_value=B.key_value);
end

プロシージャ内でクエリと削除の両方が必要な場合は、begin end ブロックに配置して、immediate(' you ddl statement here';'); を実行できます。

于 2013-03-29T19:38:01.513 に答える
0

そのため、制約/主キーを追加してください。これにより、すべての選択を削除できます。@ Egor_Skriptunoff が推奨するMERGEの使用を検討してください。

または、選択した列のインデックスを追加します。

于 2013-03-21T11:00:11.020 に答える