Oracle 创建索引

发布时间 2023-03-24 20:29:39作者: 每天进步多一点

创建索引一般分为在线索引和非在线索引,在线与非在线的区别:非在线锁表,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML操作,但副作用就是慢。
如果在生产环境操作,不停服务的话,势必导致创建索引期间仍有DML操作进来。另外如果是大表,那么采用非在线而导致锁表所带来的影响可能会很大。一句话,生产环境不停服的脚本操作,建议使用online。
1、创建索引。

create index IX_CELL_SC_BOX_CONTAINER_C1 on CELL_SC_BOX_CONTAINER (CREATE_TIME, CARRIER_ID, LOAD_ID, LOAD_STATUS, FACILITY_RRN) tablespace TBS_MY_INDEX
pctfree 10
initrans 2
maxtrans 255;

2、创建在线索引。

 create index indx_user_info on user_info(user_id, user_name) online tablespace TBS_MY_INDEX ;

3、删除索引。

DROP INDEX 索引名;

4、查看某个表的索引,表名需大写。

SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名'

5、查看某个表哪些列有索引。

SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = '表名'

如果在where 子句中有OR 操作符或单独引用复合索引列的后面列则将不会走索引,将会进行全表扫描。

6、基本用法汇总。

--创建索引
CREATE [UNIQUE] INDEX <索引名>
ON <基本表名> (<列名> [<次序>],[,<列名> [<次序>]]…); 
--说明:
--UNIQUE:规定索引的每一个索引值只对应于表中的唯一记录。
--<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序)。
 
--索引的创建语句(简洁)
create index 索引名 on 表名(列名);
 
--标准语法
create index 索引名 on 表名(列名) tablespace 表空间名;
 
--tablespace 表空间名 可以省略,以下皆省略
 
--创建唯一索引
create unique index 索引名 on 表名(列名);
 
--复合索引/组合索引
create index 索引名 on 表名(列名1, 列名2, 列名3, ...);
 
--反向键索引
create index 索引名 on 表名(列名) reverse;
 
--删除索引
drop index 索引名 on 表名;
 
--降序索引​
​CREATE INDEX 索引名 ON 表名(列名 desc) ;  --升序asc
 
--查看某个表中的所有索引
select * from all_indexes where table_name = '表名'
 
--查看某个表中建立了索引的所有列
​select * from all_ind_columns where table_name = '表名'