不要な空き領域を削除したいパーティション分割テーブルがあります。通常、次のようなコマンドを実行します。
ALTER TABLE {table name} MODIFY SUBPARTITION {subpartion name} SHRINK SPACE;
ALTER TABLE {table name} MODIFY PARTITION {partion name} SHRINK SPACE;
ただし、テーブルには関数ベースのインデックスがあるため、特定のテーブルでエラーが発生します( shrink_clauseの制限 を参照)。
ORA-10631:このオブジェクトにはSHRINK句を指定しないでください
テーブルのインデックスはすべてローカルです。グローバルインデックスはありません。誰かが空きスペースを縮小する解決策を知っていますか?
関数ベースのインデックスの削除、スペースの縮小、インデックスの再作成はオプションではありません。テーブルが非常に大きい(2,000億行、それぞれ20 Tバイト)ので、時間がかかりすぎます。表全体ではなく、いくつかのサブパーティションのみを縮小する必要があります。
また、そのパーティションで関数ベースのインデックスを無効にしようとしましたが( パーティションテーブルの部分インデックス を使用して)、それも機能しませんでした。
1つのアイデアは、パーティション交換を使用することです。これにより、一度に1つのパーティションに必要なスペースを縮小できます。私はこれを自分でテストすることができないので、まず開発環境で慎重にテストしてください。これを行うには、少なくとも2つの異なる方法があります。
方法1:
ALTER TABLE ... EXCHANGE PARTITION ... WITH TABLE ...
を使用して、パーティションを交換します。方法2:
ALTER TABLE ... EXCHANGE PARTITION ... WITH TABLE ...
を使用して、1つのパーティションを新しいテーブルに移動します。これは、 Partition Exchange および Database VLDB and Partitioning Guide による関数ベースのインデックスを持つパーティションでも機能するはずです。インデックスはローカルであるため、大きなテーブルのインデックスを無効にするべきではありません。 INCLUDING INDEXES
オプションを指定する場合、インデックスは新しいテーブルでもすべて有効である必要があります。SHRINK SPACE
コマンドの発行、インデックスの再作成を試すことができますが、インデックスを再作成すると、新しいテーブルに多くの不要な空き領域が生じる可能性があります。個人的には方法1の方が好きです。大きなテーブルでの可用性が向上し、少ない作業でより予測可能な結果が得られるはずです。
注意すべき点の1つは、関数ベースのインデックスを持つパーティションを交換するときに、ある時点で統計に何らかの問題があったことです。あなたはそれについてより多くの情報を見つけることができます ここ 。