自動コミット用のオラクルに組み込みの機能はありますか? たとえば、100 万行を更新したい場合や、自動コミットを 1000 行または 2000 行に設定したい場合は、どこかで構成する必要があります。
1000 行または 2000 行ごとに自動コミットを使用してループ内の 100 万行を更新します。この機能は sqlloader で利用できます。同様の機能が Oracle でも利用できるかどうかを知りたいです。
3 に答える
いいえ。単一の SQL ステートメントが実行している作業を段階的にコミットするように Oracle に依頼することはできません。それは ACID 準拠のアトミシティの部分に違反するため、リレーショナル データベースが許可することは非常に悪いことです。そうすることは、データベースが失敗した場合、または N 行を処理した後にステートメントが失敗した場合、どの N 行が処理されたかを知る方法がないことを意味します。これを行うと、他のユーザーが部分的に完全なデータを表示して、レポートが不正確になり、クエリが誤解を招く結果を返す可能性があることを意味します。
もちろん、行をバッチで更新する独自のカスタム ロジックを作成することもできます。しかし、それは一般的に悪い考えです。暫定コミットを実行しているプロセスを実行するには、時間がかかります。プロシージャが再入可能であることを確認するためのコードを記述する必要があります (つまり、サーバー障害が発生した場合に、既に更新およびコミットされた行を再更新しようとせずに中断したところから再開できるようにするか、または少なくともデータを別の値に更新しないでください. これにより、更新がサーバー上でさらに生成さUNDO
れREDO
ます. データを使用するすべてのプロセスが、データの処理中にデータを読み取る可能性があることを認識する必要があります.UPDATE
声明。また、ORA-01555 エラーのリスクが高まります。通常、暫定的なコミットを行う必要はありません。マイナス面は、非常にめったに価値がありません。
はい。これはDBMS_PARALLEL_EXECUTEで実行できます。
パッケージは明らかに並行して実行するためのものですが、各「チャンク」の後にコミットも行います。をchunk_size
1000 または 2000 行に設定し、parallel_level
を 0 に設定してシリアルで実行できます。
簡単な例を次に示します。
create table table1(a number);
insert into table1 select level from dual connect by level <= 100000;
commit;
begin
dbms_parallel_execute.create_task('update_table1');
dbms_parallel_execute.create_chunks_by_rowid(
task_name => 'update_table1',
table_owner => user,
table_name => 'TABLE1',
by_row => true,
chunk_size => 1000
);
dbms_parallel_execute.run_task(
task_name => 'update_table1',
sql_stmt => 'update table1 set a = 5 where rowid between :start_id and :end_id',
language_flag => dbms_sql.native,
parallel_level => 0);
end;
/
途中でクエリまたはセッションを強制終了してみてください。一部の変更のみがコミットされたことを確認でき、 でチャンクのステータスを追跡できますdba_parallel_execute_chunks
。
ただし、この機能はほとんど常に悪い考えであるという Justin Cave と Wolf の意見に同意します。
構文 AUTOCOMMIT { オン | OFF } 説明 接続の自動コミット モードをオンまたはオフにします。JDBC は、デフォルトの自動コミット モードが ON であることを指定します。特定の種類の処理では、自動コミット モードをオフにする必要があります。自動コミットについては、『Java DB 開発者ガイド』を参照してください。
未処理のトランザクションがあるときに自動コミット モードがオフからオンに変更された場合、その作業は、自動コミットがオンになったときではなく、現在のトランザクションがコミットされたときにコミットされます。未処理のトランザクションがある場合は、自動コミットをオンにする前にコミットまたはロールバックを使用して、自動コミット モードに戻る前に以前のすべての作業が完了するようにします。
Example
ij> autocommit off;
ij> DROP TABLE menu;
0 rows inserted/updated/deleted
ij> CREATE TABLE menu (course CHAR(10), item CHAR(20), price INT);
0 rows inserted/updated/deleted
ij> INSERT INTO menu VALUES ('entree', 'lamb chop', 14),
('dessert', 'creme brulee', 6),
('appetizer', 'baby greens', 7);
3 rows inserted/updated/deleted
ij> commit;
ij> autocommit on;
ij>