クライアント向けの現在のプロジェクトでは、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 分もかからないのはなぜですか?
また、この種の変更を行うために使用されるベスト プラクティスや一般的なアプローチはありますか? ご協力いただきありがとうございます!