1

クライアント向けの現在のプロジェクトでは、Oracle データベース (11g) を使用する必要があります。私のこれまでのデータベース経験のほとんどは、MSSQL Server、Access、および MySQL に関するものでした。私は最近、信じられないほど奇妙に思える問題に遭遇しました。誰かが明確にしてくれることを願っていました。

私は次のような声明をしようとしていました:

update MYTABLE set COLUMN_A = COLUMN_B;

MYTABLE には約 1,300 万行あります。

ソース列は索引付けされていますが (COLUMN_B)、宛先列は索引付けされていません (COLUMN_A)。

主キー フィールドは GUID です。

これは 4 時間実行されているようですが、完了していないようです。

私よりも Oracle に詳しい元開発者と話をしたところ、通常はこれをコミットするデータのチャンク (約 1000 レコード程度) に分割する手順を作成するとのことでした。この手順では、1,300 万件のレコードを反復処理し、1,000 件のレコードをコミットしてから、次の 1,000 件をコミットします。通常、主キーに基づいてデータを分割します。

これは、他のデータベース システムでの経験から考えると、ややばかげているように思えます。別のテーブルに参加したり、別のデータベースにリンクしたりしていません。ある列から別の列にデータをコピーしているだけです。数十億のレコードのオーダーでシステムが存在することを考えると、1,300 万のレコードが大きいとは考えていません。全体として 1 GB 未満のストレージを占有するテーブル内のデータの単純な列をコピーするのに、コンピューターが何時間も (失敗するだけで) かかるとは想像できません。

私が望むものを達成するための別の方法を試す際に、次のことを試しました。

create table MYTABLE_2 as (SELECT COLUMN_B, COLUMN_B as COLUMN_A from MYTABLE);

これは、まったく同じ最終結果を達成するのに 2 分もかかりませんでした (最初のテーブルを削除し、新しいテーブルの名前を変更することを除いて)。

UPDATE が 4 時間実行されて失敗する (1 つの列を別の列にコピーするだけ) のに、テーブル全体をコピーする create table に 2 分もかからないのはなぜですか?

また、この種の変更を行うために使用されるベスト プラクティスや一般的なアプローチはありますか? ご協力いただきありがとうございます!

4

1 に答える 1

4

私には奇妙に思えます。しかし、これは頭に浮かぶ:

テーブルを更新するときは、ロールバックが必要な場合に備えてトランザクション ログを作成する必要があります。テーブルを作成する必要はありません。

于 2013-09-10T22:51:55.203 に答える