时间:2022-06-14 10:11:25 | 栏目:Oracle | 点击:次
索引一般是B-Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的。
create [unique] index studentin student(id [desc]);
(ORACLE在UNIQUE和主键字段上自动建立索引 。)
create index my_ix on my_table(my_col,0);
create index a on table(decode(status,0,0))--只关心少数status为0的行。
索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作复合索引。例如,以下语句创建一个具有两列的复合索引:(复合索引列数量不超过32个)
CREATE INDEX name ON employee (emp_lname, emp_fname)
复合索引的第一列称为前导列(leading column)。
CREATE INDEX idx_example ON table1 (col1 ASC, col2 DESC, col3 ASC)
在这种情况下,以下查询可以得到优化:
SELECT col1, col2, col3 from table1 ORDER BY col1 ASC, col2 DESC, col3 ASC
和
SELECT col1, col2, col3 from example ORDER BY col1 DESC, col2 ASC, col3 DESC
创建语法是在普通索引创建的语法中index前加关键字bitmap即可,例如:
create bitmap index t_ix_执行人 on t(执行人);
位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等)。
索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码。
位图索引存储数据的方式相对于B-Tree索引,占用的空间非常小,创建时不需要排序,定位存储,创建和使用非常快。
比如执行如下一条SQL语句:
select * from emp where upper(ename) = 'KING',
即使在ename上建立了索引,还是会全表扫描emp表,将里面的ename字段改成大写跟常量KING进行比较。
如果我们建立一个基于函数的索引,比如:
create index emp_upper_idx on emp(upper(ename));
这个时候,我们只需要按区间扫描小部分数据,然后获取rowid取访问表中的数据,这个速度是比较快的。
如果建立一个普通索引,这个索引会非常大,而且将N修改成Y的时候,维护这个索引开销会很大。
如果建立一个位图索引,但这是一个事务系统(OLTP),可能有很多人同时插入记录,或者进行修改。那么位图索引也不适合。所以,如果我们只是在值为N的行上建立索引,就比较好办了。
只在值为N的行建立索引:
create index flag_index on big_table(case flag when 'N' then 'N' end);
这样一个索引大小会大大降低,而且维护成本也会很低的。前提是我们只对值为N的行感兴趣。