Oracle10g 索引構成表のおさらい の巻

気がつけば6月、梅雨入りも目前です。
昨年は梅雨に入ったのか、明けたのか分からない日々が続きましたがそう考え
ると、もう1年経ったのですね。
時間経過の早さに少し気持ちが凹みそうですが頑張っていきましょう。

今週は「10gでの索引構成表」についておさらいをしていきます。

★☆★
Oracle 10gより索引構成表については以下の対応が行われています。

1)パーティション化された索引構成表に対するグローバル索引の属性変更が
可能になりました。
2)ローカルパーティション化された索引構成表へビットマップ索引を作成す
ることが可能になりました。
3)リストパーティション化された索引構成表の属性変更が可能になりました。
9iではリストパーティション自体、索引構成表にはできませんでした。
作成しようとするとこんなエラーがでます(ORA-25198)「範囲およびハッ
シュパーティション化のみが索引構成表でサポートされます。」
4)全てのパーティション化された索引構成表でLOB列が使用できるようにな
りました。

☆★☆★☆★
1)と2)についてみてみます。

9iではパーティション変更操作が実行されるとパーティション化された索引構
成表上のグローバル索引が維持できません。
(実際にはDROP、TRUNCATE等の後、グローバル索引がUNUSABLEになりました)
そのためグローバル索引が使用できずアクセスのパフォーマンスは低下してい
ました。

1)グローバル索引ステータスが変わらないことからみてみましょう。

◆環境
Microsoft Windows XP Pro
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 – Production
With the Partitioning, OLAP and Data Mining options

◆設定

SQL> CREATE TABLESPACE TPART01
  2  DATAFILE 'C:ORACLEPRODUCT10.1.0~略~O1_MF_TPART01.DBF'
  3  SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
  4  MINIMUM EXTENT 1M
  5  DEFAULT STORAGE(INITIAL 10M ~略);
表領域が作成されました。

○9iでも試したいのでレンジパーティションにしておきます。

SQL> CREATE TABLE range_part_smp
  2  (
  3   x1 NUMBER(5),
  4   x2 CHAR(30),
  5   x3 INTEGER,
  6   x4 VARCHAR2(10),
  7   PRIMARY KEY (x1, x2, x3)
  8  )
  9  ORGANIZATION INDEX 
 10  PARTITION BY RANGE(x3) 
 11  (
 12   partition p1 VALUES LESS THAN (50) tablespace TPART01,
 13   partition p2 VALUES LESS THAN (MAXVALUE) tablespace TPART01
 14  );
表が作成されました。

SQL> INSERT INTO range_part_smp values (1,'2',3,'4');
1行が作成されました。
(中略)
SQL> INSERT INTO range_part_smp values (5,'2',3,'4');
1行が作成されました。
SQL> COMMIT;
コミットが完了しました。

◆確認

SQL> select index_name, partition_name, status from user_ind_partitions;

INDEX_NAME         PARTITION_NAME  STATUS
------------------ --------------- -------
SYS_IOT_TOP_47204  P1              USABLE
SYS_IOT_TOP_47204  P2              USABLE

SQL>  alter table range_part_smp truncate partition P1;
表が切り捨てられました。

SQL> select index_name, partition_name, status from user_ind_partitions;

INDEX_NAME         PARTITION_NAME  STATUS
------------------ --------------- -------
SYS_IOT_TOP_47204  P1              USABLE
SYS_IOT_TOP_47204  P2              USABLE

10gではステータスが維持されています。

○因みに9iではこんな感じです。

SQL> select index_name, partition_name, status from user_ind_partitions;
INDEX_NAME         PARTITION_NAME  STATUS
------------------ --------------- --------
SYS_IOT_TOP_37470  P1              UNUSABLE
SYS_IOT_TOP_37470  P2              USABLE

☆★☆★☆★
2)ローカルパーティション化された索引構成表へ
ビットマップ索引を作ってみましょう。

◆確認

SQL> CREATE TABLE range_part_smp2
  2  (
  3   x1 NUMBER(5),
  4   x2 CHAR(30),
  5   x3 INTEGER,
  6   x4 VARCHAR2(10),
  7   PRIMARY KEY (x1, x2, x3)
  8  )
  9  ORGANIZATION INDEX 
 10  PARTITION BY RANGE(x3) 
 11  (
 12   partition p1 VALUES LESS THAN (50) ,
 13   partition p2 VALUES LESS THAN (MAXVALUE)
 14  );

SQL> create bitmap index i_range_part_smp2 on range_part_smp2(x4) local;
create bitmap index i_range_part_smp2 on range_part_smp2(x4) local
                                         *
行1でエラーが発生しました。:
ORA-28669: bitmap index can not be created on an IOT 
with no mapping table

○エラーになってしまいました。
マニュアルをみるとマッピング表でなけれな駄目でした。
(ALTER 文での変更も可能です)

SQL> CREATE TABLE range_part_smp2
      --略--
  9       ORGANIZATION INDEX
 10       MAPPING TABLE
 11       PARTITION BY RANGE(x3)
      --略--
表が作成されました。

SQL> create bitmap index i_range_part_smp2 on range_part_smp2(x4) local;
索引が作成されました。

■おさらい
Oracle 10gより索引構成表に関してパーティション化を含めた機能拡張や
パフォーマンスの考慮が充実してきています。
10gユーザとなった際は使ってみてください。

今週はここまで。

まだ梅雨入りせず茅ヶ崎より