默认索引组织表。DM默认的聚簇索引是rowid
- primary key
- cluster key
- unique key
索引类型: - 聚簇索引 有且只有一个默认创建
- 唯一索引 保证不会有两行数据具有相同的值
- 函数索引 包括函数表达式预先计算的值
- 复合索引 大于1列一起建立索引 也叫组合索引
- 位图索引 列上的值的类型少
- 全文索引 文本列上建索引
- 分区索引 分区表上建的索引
索引采用的是B+树
索引也占存储空间,存储在专属的表空间中
唯一索引
CREATE TABLE TEST.T11(ID INT,name VARCHAR(20));
CREATE UNIQUE INDEX TEST.T11_index on TEST.T11(ID) TABLESPACE "test01";
查看索引
SELECT * from SYS.DBA_INDEXES WHERE TABLE_NAME='T11';
默认有一个cluster的聚簇索引
函数索引
CREATE TABLE TEST.T12 as SELECT * from DMHR.EMPLOYEE;
SELECT * from TEST.T12;
CREATE INDEX TEST.T12_index ON TEST.T12(upper(email)) TABLESPACE "test01";
EXPLAIN SELECT EMPLOYEE_NAME,EMPLOYEE_ID,EMAIL from TEST.T12 WHERE upper(email)='maxueming@dameng.com';
索引生效
复合索引(组合索引)
由表中的多列组成
CREATE INDEX TEST.T12_index2 ON TEST.T12(EMPLOYEE_ID,EMPLOYEE_NAME) TABLESPACE "test01";
EXPLAIN SELECT * FROM TEST.T12 where TEST.T12.EMPLOYEE_NAME='马学铭';
索引生效
位图索引
性别适合建位图索引
create TABLE TEST.T13(ID int,gender CHAR(1),name VARCHAR(20));
INSERT INTO TEST.T13 VALUES(1,0,'zhangsan');
SELECT * FROM TEST.T13;
CREATE BITMAP INDEX TEST.T13_index ON TEST.T13(gender);
BEGIN
dbms_stats.gather_table_stats('TEST','T13',NULL,100,FALSE,'FOR ALL COLUMNS SIZE AUTO');
end;
BEGIN
dbms_stats.column_stats_show('TEST','T13','GENDER');
END;
EXPLAIN SELECT * FROM TEST.T13 where t13.GENDER=0;
没有走索引的原因是因为表中只有一行数据 ,系统会认为走全表比走位图索引更快一点,但是索引是建成功的。
分区索引
如果表是分区表的话 建立的索引就是分区索引
CREATE INDEX T1_idx ON TEST.T1(ID)
STORAGE(INITIAL 1,NEXT 1,MINEXTENTS 1,ON DMTS01);
全文索引
全文检索的中文分词依赖系统词库,该词库是只读的,不允许修改
CREATE CONTEXT INDEX idx_loca ON DMHR.LOCATION(STREET_ADDRESS)lexer default_lexer;
alter CONTEXT INDEX DMHR.idx_loca ON DMHR.LOCATION rebuild;
SELECT * FROM DMHR.CTI$IDX_LOCA$I;--【I D N P】
如何使用全文索引
SELECT * FROM DMHR.LOCATION WHERE CONTAINS(STREET_ADDRESS,'东路'and'28');
SELECT * FROM DMHR.LOCATION WHERE STREET_ADDRESS LIKE '%东路%'and STREET_ADDRESS LIKE'%28%';
索引维护
索引维护,包括收集统计信息,建议不要在业务高峰时间段进行。
查看索引的相关信息
- dba_indexes
- user_indexes
重建索引
ALTER INDEX TEST.T12_index REBUILD;
删除索引
drop index TEST.T12-INDEX;