テーブルにアクティビティを記録するアプリケーションがあります(Oracle10g)。ロギングレコードは少なくとも30日間保持する必要があります。このテーブルには、毎月約2,000万行が追加されると予想しています。
DBAは、テーブルを1週間のデータを含むパーティションに分割することを提案しました。毎週のメンテナンススクリプトは、最も古いパーティションを削除します(テーブルに4週間のデータのみを残します)。
このロギングテーブルを分割する最良の方法は何でしょうか?
テーブルにアクティビティを記録するアプリケーションがあります(Oracle10g)。ロギングレコードは少なくとも30日間保持する必要があります。このテーブルには、毎月約2,000万行が追加されると予想しています。
DBAは、テーブルを1週間のデータを含むパーティションに分割することを提案しました。毎週のメンテナンススクリプトは、最も古いパーティションを削除します(テーブルに4週間のデータのみを残します)。
このロギングテーブルを分割する最良の方法は何でしょうか?
テーブルのパーティション分割は難しくありません。データは毎週削除されるように見えるため、パーティション句は次のようになります。
PARTITION "P2009_45" VALUES LESS THAN
(TO_DATE(' 2009-11-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "P2009_46" VALUES LESS THAN
(TO_DATE(' 2009-11-09 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
... etc
ここで、パーティション化列は、テーブルで関心のある日付列です。
追加コメント:
最も可能性の高いパーティション分割スキームは、作成日にデータを範囲分割することです。毎週新しいパーティションを作成し、最も古いパーティションを削除します。影響は、このテーブルがどのように使用/インデックス付けされるかによって異なります。
これはおそらくインデックスが作成されていないログ テーブルであるため、パーティションを削除してもほとんど影響はありません。参照オブジェクトは無効化されず、削除にはパーティション ロックが必要になるだけです (最も古いパーティションを挿入する必要はありません)。その時)。
テーブルがインデックス化されている場合、インデックスをグローバルにするかパーティション化するかを決定する必要があります。パーティションを削除すると、グローバル インデックスを再構築する必要があります (20M 行はまだ管理可能ですが、時間がかかります)。この句を使用してUPDATE GLOBAL INDEXES
、パーティションの削除後も索引を有効に保つことができます。
ローカル インデックスはテーブルのように分割され、グローバル インデックスよりも効率が悪い場合があります (日付でクエリを実行しない場合、インデックス レンジ スキャンでは、共通インデックスではなく、各ローカル インデックスをスキャンする必要があります)。これらのインデックスは、パーティションの削除後に更新する必要はありません。
毎月 2,000 万行のデータを 30 日分保持すればよいでしょうか? (それは約1か月の価値です)。
12 か月分のデータがあっても、正しいインデックスを使用してこのテーブルを (1 つの大きなテーブルとして) クエリすることは難しくありません。ロギング テーブルに 1 行でも 2,000 万行でも、挿入は問題ありません。
Oracle のパーティショニングも、私が正しければ有償の機能なので、コストもかかります (まだライセンスを持っていない場合)。