2016-11-17 11 views
1

テーブル2に30億行(テーブル1)の30億行のテーブルがあります。これらの2つのテーブルは関連しています。私はテーブル1とその関連する行から30億行をテーブル2から削除しなければなりません。テーブル1はテーブル2の子です。私はplsqlからfor allメソッドを使ってみましたが、あまり役に立たなかった。そして、私はoracleパーティション戦略の使用を考えました。私はDBAではないので、選択したID番号の主キー列で既存のテーブルのパーティショニングが可能かどうかを知りたいですか?私の主キーは64ビットの自動生成番号です。関連する2つのテーブルから30億行を削除する方法

+0

使用しているOracleのバージョンは? –

+0

私はOracle 11gを使用しています –

答えて

0

非常に疑わしいですね。
実際のユースケースの場合は、パーティション化されたものも含めて、明確に定義された別のテーブルを作成して削除しないで、insert /*+ append */ into MyNewTable select ...を使用して入力します。
最も一般的な方法は、日付(レコードの作成日、イベントの日付など)にパーティションを定義することです。
また、これが本当のユースケースである場合は、本当の助けを得るために、インターネット上の助言を求めず自分でやってはいけないことを強くお勧めします。

+0

パーティション化するには、そのオプションとエンタープライズエディションのライセンスを購入する必要があります。 – BLaZuRE

+0

@BLaZuREもし彼がちょうど遊んでいて本当に重要なことはないが、それがビジネスのように行動し、ライセンスを購入して業界標準に追いつくか、無料のソリューションに移り、そうでなければ、彼は巨大な死んだテーブルとビジネスを見つけることができません。 –

3

オブジェクトをオンラインでパーティション化するのは難しいです(dbms_redefinitionを使用して行うことができます)。そして必要ではありません(あなたが与えた細部による)。

ベストアイデアは、望ましくない行がないオブジェクトを再作成することです。これは、(あなたがテスト環境でそれらをテストする必要があります)消費者をオフラインに行うことができますが、スクリプトがOKであれば、彼らのために非常に小さいダウンタイムとなり

create table undesired_data as (select undesired rows from table1); 
Create table1_new as (select * from table1 where key not in (select key from undesired_data)); 
Create table2_new as (select * from table2 where key not in (select key from undesired_data)); 
rename table1 to table1_old; 
rename table2 to table2_old; 
rename table1_new to table1; 
rename table2_new to table2; 
recreate constraints; 
check if everything is ok; 
drop table1_old and table2_old; 

例えば、いくつかの簡単なコードは次のようになります。

+0

これは、もちろん、次回のためにパーティション化されたテーブルに移動する機会にもなります。 –

+0

@DavidAldridge素早い返答をありがとう。私が考えたもう1つのアプローチは、テーブルをオフラインにして、必要な行を持つ新しいパーティションを作成することです。その後、不要な行でパーティションを削除します。私は必要な行を識別することができます。しかし、プライマリ・キーに基づいて識別された行に対してパーティション化を実行できるかどうかはわかりません。主キーに基づいて既存のテーブルを分割する例はありますか?また、私は、パーティショニングに比べてCTASのアプローチが時間を節約できるかどうかを知りたいですか? –

関連する問題