tshizuku03の日記

主にoracleやLinuxコマンドについての記事を載せていきたいと思っています。

パーティションテーブル グローバルインデックスの注意点

パーティションテーブルの思わぬ落とし穴をここに残します。
まだ、調査段階なので 第一弾ってところです。
 
1、パーティションのindex運用の課題
パーティションテーブルで、グローバルインデックスを使用している場合、
メンテナンス(パーティションDROP、結合)実施すると
INDEXが使用不可となりパフォーマンス低下!
 
2、回避案(案)
調べたところ、以下3つ案が見つかったので残します。
※検証は後日実施予定
 
①オンラインでグローバルインデックス作成
CREATE INDEX 索引名 ON パーティション表名(列名) LOCAL;
データを削除してから行うことで、UNUSABLEにしないようにできます。
SQL> DELETE FROM tab1 PARTITION (p01);
SQL> ALTER TABLE tab1 DROP PARTITION p01;
 
②索引の自動更新
※実行時間に時間がかかる、要検証
グローバルインデックス
SQL> ALTER TABLE tab1 TRUNCATE PARTITION p01 UPDATE GLOBAL INDEXES;
ローカルインデックス
SQL> ALTER TABLE tab1 MOVE PARTITION p01 UPDATE INDEXES;
 
③ローカルINDEXに変更
※オンラインでの変更手順は探せなかった・・ので、作業中は一時的にindexがない状態となる
1,create unique index PK名 on スキーマ.テーブル名_BK ("CLIENT_ID","CAR_DAY_DATE","STOCK_ID") LOCAL;
 
2,alter table スキーマ.テーブル名 ADD CONSTRAINT PK名 PRIMARY KEY ("CLIENT_ID","CAR_DAY_DATE","STOCK_ID") USING INDEX tablespace PK表領域;
 
 
 
Appendix
L技術情報
 
表のパーティション・タイプの確認
SELECT table_name,partitioning_type,partition_count 
FROM dba_part_tables;
 
パーティション表定義の確認
select table_name,partition_name,high_value 
from dba_tab_partitions;
 
 統計情報の取得もパーティション単位で可能
BEGIN DBMS_STATS.GATHER_TABLE_STATS
(‘スキーマ名',‘テーブル名’,’パーティション名');
END;
/
 
パーティションアドバイザ
ワークロード(システムで実行されるSQL文)を解析し、適切なパーティションを推奨する機能