前回の記事では、Oracleのパーティションテーブルについて学習しました。そのシリーズの続きとして、ここではOracleパーティションインデックスを紹介します
パーティションインデックスの理解に関するいくつかの事実は次のとおりです
ローカルパーティションインデックス
- パーティションテーブルのローカルインデックスが作成され、基になるパーティションテーブルとまったく同じ方法でインデックスがパーティション化されます。つまり、ローカルインデックスは、テーブルのパーティション分割方法を継承します。これは、等分割として知られています。
- ローカルインデックスの場合、インデックス内のインデックスキーは、単一の基になるテーブルパーティションに格納されている行のみを参照します。ローカルインデックスは、LOCAL属性を指定することによって作成され、UNIQUEまたはNON-UNIQUEとして作成できます。
- テーブルとローカルインデックスはまったく同じ方法でパーティション化されるか、ローカルインデックスが自動的に維持されるため、同じパーティションキーを持つことで、より高い可用性を提供できます。
- Oracleデータベースは、インデックスパーティションが対応するテーブルパーティションと同期していることを確認するため、基になるテーブルでメンテナンス操作が実行されるたびに、データベースがインデックスパーティションを自動的に維持します。
- たとえば、パーティションが追加、削除、またはマージされたとき。
- テーブルのパーティションキーとインデックスキーが同じ場合、ローカルインデックスのプレフィックスが付けられます。それ以外の場合は、ローカルの接頭辞なしのインデックスです
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id) LOCAL (partition test_idx_1, partition test_idx_2, partition test_idx_3, partition test_idx_4); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='TEST_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS --------- ----------- ------ TEST_IDX IX_TEST_IDX_1 USABLE TEST_IDX IX_TEST_IDX_2 USABLE TEST_IDX IX_TEST_IDX_3 USABLE TEST_IDX IX_TEST_IDX_4 USABLE
グローバルパーティションインデックス
- グローバルパーティションインデックスは、独立してパーティション化された、つまりテーブルとは異なるパーティション化キーを使用する、パーティション化されたテーブルまたはパーティション化されていないテーブルのインデックスです。グローバルパーティションインデックスは、範囲またはハッシュパーティションにすることができます。グローバルパーティションインデックスは、ローカルインデックスよりも保守が困難です。ただし、個々のレコードへのより効率的なアクセス方法を提供します。
- パーティションのメンテナンス中のテーブルまたはインデックスの相互作用中に、グローバルインデックス内のすべてのパーティションが影響を受けます。
- 基になるテーブルパーティションでSPLIT、MOVE、DROP、またはTRUNCATEメンテナンス操作が実行されている場合、グローバルインデックスとグローバルパーティションインデックスの両方が使用不可としてマークされます。したがって、パーティションの独立性はグローバルインデックスでは不可能です。
- テーブルパーティションで実行される操作のタイプによっては、テーブルのインデックスが影響を受けます。テーブルパーティションを変更する場合は、UPDATEINDEXES句を指定できます。これにより、影響を受けるグローバルインデックスとパーティションが自動的に維持されます。
- このオプションを使用する利点は、インデックスがオンラインのままであり、操作全体で利用可能であり、操作が完了した後で再構築する必要がないことです。
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id) GLOBAL PARTITION BY RANGE (id, item_id) (partition EXP_PART_IDX_1 values less than (20, 200), partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue)); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='EXP_PART_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS EXP_PART_IDX EXP_PART_IDX_1 USABLE EXP_PART_IDX EXP_PART_IDX_2 USABLE
グローバル非パーティションインデックス
- グローバル非パーティションインデックスは、任意のパーティション内の任意の個々のレコードへの同じ効率的なアクセスを提供し、非パーティションインデックスと同じように動作します。インデックス構造はパーティション化されていないため、インデックスはすべてのパーティションで使用できます。
- このタイプのインデックスが役立つシナリオは、テーブルのパーティションキーをフィルタとして含まないクエリを使用する場合ですが、Oracleオプティマイザでインデックスを使用する必要があります
よくある質問
インデックス定義の先頭の列がパーティションキー列である場合、インデックスはプレフィックス付きと呼ばれます。それ以外の場合は、プレフィックスなしと呼ばれます。
いいえ、グローバルインデックスをサブパーティション化することはできませんが、パーティション化することはできます。インデックスサブパーティションを作成する唯一の方法は、ローカルインデックスを使用してサブパーティションテーブルを作成することです
DBA_PART_INDEXESの列LOCALITYを照会する。
また読む
- Oracleデータベース管理チュートリアル
- https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
- Oracleの日付形式を変更する