q索引是与表相关的一个可选结构q用以提高 SQL 语句执行的性能q减少磁盘I/Oq使用 CREATE INDEX 语句创建索引q在逻辑上和物理上都独立于表的数据qOracle 自动维护索引
|
唯一索引确保在定义索引的列中没有重复值Oracle 自动在表的主键列上创建唯一索引使用CREATE UNIQUE INDEX语句创建唯一索引
SQL> CREATE UNIQUE INDEX item_index
ON itemfile (itemcode);
SQL> CREATE INDEX comp_index
ON itemfile(p_category, itemrate);
q通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上比如学号是1001,1002,1003,1004——>1001,2001,3001,4001这样的形式存在于索引块中。q创建索引时使用REVERSE关键字SQL> CREATE INDEX rev_index
ON itemfile (itemcode) REVERSE;SQL> ALTER INDEX rev_index REBUID NOREVERSE;
q 位图索引不直接存储ROWID值,而是存储字节位到ROWID的映射q节省空间占用q如果索引列 被经常更新的话,不适合建立位图索引q总体来说,位图索引适合于数据仓库中,不适合OLTP中SQL> CREATE BITMAP INDEX bit_index
ON order_master (orderno);
q表达式中不能出现聚合函数q不能在LOB类型的列上创建q创建时必须具有 QUERY REWRITE 权限
SQL> SELECTtoyid FROM toyWHERE LOWER(toyname)='doll';这样上面的查询就会变快了,索引是在列的小写函数上建立的;查询快不快关键在于where的过滤好不好
其中:ONLINE使得在重建索引过程中,用户可用对原来的索引进行修改;
NOLOGGING表示在重建过程中产生最少的重做条目redoEntry;
q局部分区索引 - 在分区表上创建的索引,在每个表分区上创建独立的索引,索引的分区范围与表一致
SQL> create table test_partition (2 id number(20),name varchar2(20),account number(20)) partition by range(account)(3 partition part01 values less than (100),4 partition part02 values less than (200),5 partition part03 values less than(maxvalue));Table created
SQL> create index test_partition_index on test_partition(account) local;Index created
SQL> select ui.INDEX_NAME,ui.index_type,ui.PARTITIONED from user_indexes ui where ui.INDEX_NAME='TEST_PARTITION_INDEX';INDEX_NAME INDEX_TYPE PARTITIONED------------------------------ --------------------------- -----------TEST_PARTITION_INDEX NORMAL YES
SQL> select uip.index_name,uip.partition_name,uip.high_value from user_ind_partitions uip where uip.index_name='TEST_PARTITION_INDEX';INDEX_NAME PARTITION_NAME HIGH_VALUE------------------------------ ------------------------------ --------------------------------------------------------------------------------TEST_PARTITION_INDEX PART01 100TEST_PARTITION_INDEX PART02 200TEST_PARTITION_INDEX PART03 MAXVALUE
SQL> select utp.table_name,utp.partition_name,utp.high_value from user_tab_partitions utp where utp.table_name='TEST_PARTITION';TABLE_NAME PARTITION_NAME HIGH_VALUE------------------------------ ------------------------------ --------------------------------------------------------------------------------TEST_PARTITION PART01 100TEST_PARTITION PART02 200TEST_PARTITION PART03 MAXVALUE
SQL>
q全局分区索引 - 在分区表或非分区表上创建的索引,索引单独指定分区的范围,与表的分区范围或是否分区无关
SQL> create index index_partition_global on test_partition(account) global;create index index_partition_global on test_partition(account) globalORA-01408: 此列列表已索引
SQL> drop index test_partition_index ;Index dropped
SQL> create index index_partition_global on test_partition(account) global partition by range(account) (2 partition part1 values less than (200),3 partition part2 values less than(maxvalue));Index created
SQL> select uip.index_name,uip.partition_name,uip.high_value from user_ind_partitions uip where uip.index_name='INDEX_PARTITION_GLOBAL';INDEX_NAME PARTITION_NAME HIGH_VALUE------------------------------ ------------------------------ --------------------------------------------------------------------------------INDEX_PARTITION_GLOBAL PART1 200INDEX_PARTITION_GLOBAL PART2 MAXVALUE
SQL>
q全局非分区索引 - 在分区表上创建的全局普通索引,索引没有被分区
SQL> create index index_partition_global on test_partition(account) global;Index created
SQL> select ui.INDEX_NAME,ui.index_type,ui.PARTITIONED from user_indexes ui where ui.INDEX_NAME='INDEX_PARTITION_GLOBAL';INDEX_NAME INDEX_TYPE PARTITIONED------------------------------ --------------------------- -----------INDEX_PARTITION_GLOBAL NORMAL NO
SQL>
SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
ORDER BY INDEX_NAME, COLUMN_POSITION;