探究Oracle 12c 中在同一个列上建立多个索引
Oracle 12c允许在同一组列上建立多个索引,但是只有一个索引是可见的,并且所有索引在某些方面可以有不同。
示例
Non-Partitioned Tables
例如,我们可以创建一个非分区表t1,并插入测试数据。
然后在 create_date列上创建一个索引;当第二次使用语句
CREATE INDEX t1_idx2 ON t1(created_date) INVISIBLE;
在 created_date列上再次创建索引时,提示错误。
SQL> CREATE TABLE t1 (
2 id NUMBER,
3 description VARCHAR2(50),
4 created_date DATE
5 );
表已创建。
已用时间: 00: 00: 00.08
SQL>
SQL> INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2014', 'DD/MM/YYYY'));
已创建 1 行。
已用时间: 00: 00: 00.03
SQL> INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2015', 'DD/MM/YYYY'));
已创建 1 行。
已用时间: 00: 00: 00.01
SQL> INSERT INTO t1 VALUES (3, 't1 THREE', TO_DATE('01/07/2016', 'DD/MM/YYYY'));
已创建 1 行。
已用时间: 00: 00: 00.00
SQL> COMMIT;
提交完成。
已用时间: 00: 00: 00.00
SQL> CREATE INDEX t1_idx1 ON t1(created_date) VISIBLE;
索引已创建。
已用时间: 00: 00: 00.01
SQL> CREATE INDEX t1_idx2 ON t1(created_date) INVISIBLE;
CREATE INDEX t1_idx2 ON t1(created_date) INVISIBLE
*
第 1 行出现错误:
ORA-01408: 此列列表已索引
已用时间: 00: 00: 00.06
SQL> CREATE BITMAP INDEX t1_idx3 ON t1(created_date) INVISIBLE;
索引已创建。
已用时间: 00: 00: 00.11
SQL>
但是可以使用这个语句在created_date列上来创建一个BITMAP类型的索引:
CREATE BITMAP INDEX t1_idx3 ON t1(created_date) INVISIBLE;
Partitioned Tables
创建一个分区表t1:
SQL> DROP TABLE t1 PURGE;
表已删除。
SQL>
SQL> CREATE TABLE t1 (
2 id NUMBER,
3 description VARCHAR2(50),
4 created_date DATE
5 )
6 PARTITION BY RANGE (created_date) (
7 PARTITION part_2014 VALUES LESS THAN (TO_DATE('01/01/2015', 'DD/MM/YYYY')) TABLESPACE users,
8 PARTITION part_2015 VALUES LESS THAN (TO_DATE('01/01/2016', 'DD/MM/YYYY')) TABLESPACE users,
9 PARTITION part_2016 VALUES LESS THAN (TO_DATE('01/01/2017', 'DD/MM/YYYY'))