1

テーブルにアクティビティを記録するアプリケーションがあります(Oracle10g)。ロギングレコードは少なくとも30日間保持する必要があります。このテーブルには、毎月約2,000万行が追加されると予想しています。

DBAは、テーブルを1週間のデータを含むパーティションに分割することを提案しました。毎週のメンテナンススクリプトは、最も古いパーティションを削除します(テーブルに4週間のデータのみを残します)。

このロギングテーブルを分割する最良の方法は何でしょうか?

4

3 に答える 3

2

テーブルのパーティション分割は難しくありません。データは毎週削除されるように見えるため、パーティション句は次のようになります。

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

ここで、パーティション化列は、テーブルで関心のある日付列です。

追加コメント:

  • 11gにアップグレードできる場合は、この範囲分割に似た間隔分割を利用できますが、Oracleが新しいパーティションの作成を管理します。
  • 定期的にパーティションを削除する場合は、パーティション操作後にグローバルパーティションで必要になる再構築を回避するために、テーブル上のすべてのインデックスをローカルでパーティション化することをお勧めします。
  • 1か月あたりのログエントリの数がよくわかっていて、それが比較的一定である場合は、この数を上限として0にリサイクルするシーケンス(主キーとして)を使用することを検討してください。その後、ログステートメント新しい行を作成するか、行が存在する場合はその行を上書きする「MERGEINTO...」ステートメントになる必要があります。これは、シーケンスの最大値で許可される行数を保持することを保証するだけであり、特定の時間間隔ではありませんが、これはパーティショニングの代替手段になる可能性があります(DvEが指摘するように、追加費用のオプションです)
于 2009-11-09T15:11:51.673 に答える
1

最も可能性の高いパーティション分割スキームは、作成日にデータを範囲分割することです。毎週新しいパーティションを作成し、最も古いパーティションを削除します。影響は、このテーブルがどのように使用/インデックス付けされるかによって異なります。

これはおそらくインデックスが作成されていないログ テーブルであるため、パーティションを削除してもほとんど影響はありません。参照オブジェクトは無効化されず、削除にはパーティション ロックが必要になるだけです (最も古いパーティションを挿入する必要はありません)。その時)。

テーブルがインデックス化されている場合、インデックスをグローバルにするかパーティション化するかを決定する必要があります。パーティションを削除すると、グローバル インデックスを再構築する必要があります (20M 行はまだ管理可能ですが、時間がかかります)。この句を使用してUPDATE GLOBAL INDEXES、パーティションの削除後も索引を有効に保つことができます。

ローカル インデックスはテーブルのように分割され、グローバル インデックスよりも効率が悪い場合があります (日付でクエリを実行しない場合、インデックス レンジ スキャンでは、共通インデックスではなく、各ローカル インデックスをスキャンする必要があります)。これらのインデックスは、パーティションの削除後に更新する必要はありません。

于 2009-11-09T15:26:20.703 に答える
0

毎月 2,000 万行のデータを 30 日分保持すればよいでしょうか? (それは約1か月の価値です)。

12 か月分のデータがあっても、正しいインデックスを使用してこのテーブルを (1 つの大きなテーブルとして) クエリすることは難しくありません。ロギング テーブルに 1 行でも 2,000 万行でも、挿入は問題ありません。

Oracle のパーティショニングも、私が正しければ有償の機能なので、コストもかかります (まだライセンスを持っていない場合)。

于 2009-11-09T14:30:42.773 に答える