Oracle case when索引 空值索引 位图索引
T1表里面有200W条数据,其中ID=2只有10条记录,查询ID=2时就可以用到case when索引。
建索引可以这样:
CREATE INDEX I_1 ON T1(CASE WHEN ID>1 THEN ID ELSE NULL END);
或者类似CASE ID WHEN 2 THEN 2...或者不需要大于小于,可以用DECODE
查询的SQL也要改:
SELECT * FROM T1 WHERE ID=2;
改为
SELECT * FROM T1 WHERE (CASE ID WHEN 2 THEN 2 ELSE NULL END)=2;
这个WHERE后面的括号要跟索引内容一模一样。总之这还是一个函数索引。
访问的数据块从几千个下降到几个。
这个索引原因是空值NULL不加入索引中,这样索引块其实只包含ID=2的很少的几行。
当查询条件WHERE ID IS NULL时,想使用索引的话,可以这样建一个联合索引:
CREATE INDEX I_2 ON T1(ID,0);
将执行索引扫描。
位图索引构造与B树索引不同。假如列GENDER只存在两个值,在上面建一个位图索引的话,就生成两个位图,每个位图中包含对应的所有的行号。其中的具体实现比较复杂,还有起止行等等概念。
位图索引不适合更新频繁的应用场景,比如在线联机系统使用位图索引必须慎重。因为如上,当INSERT 一条GENDER=1的数据,那全表所有GENDER=1的行都会被锁。
位图索引一般适用于分析系统,而更新数据前有必要时也要删除索引,查询时再重建。
相关推荐
好记忆也需烂 2019-07-26
FenggFocusOracle 2019-03-08
linsea 2017-03-08
幸福的猪 2015-09-17
82602716 2014-04-13
oracleerp 2011-10-18
罗罗 2020-08-16
hermanncain 2020-05-09
凌风郎少 2020-04-26
niushao 2020-01-08
Laozizuiku 2020-01-01
安得情怀似旧时 2019-12-03
Miryou 2013-07-04
夕加加 2019-10-27
duyifei0 2019-06-30
zwblcz 2019-06-28
零 2019-06-04
yaosir 2019-06-21
懒猫猫IT 2012-03-09