Oracle位图索引

 

      假设一个100W行的表有一个字段会频繁地被当做查询条件,我们会想到在这一列上面建立一个索引。但是这一列只可能取3个值。那么如果建立一个B*树索引(普通索引)是不行的,因为无论查找哪一个值,都可能会查出很多数据。那么位图索引就会很适合了。

 

      如果我们在emp表的job列建立一个位图索引:

 

 create BITMAP index job_idx on emp(job);

     oracle在索引中存储的内容可能是这样的:


     Oracle位图索引

       ANALYST,CLERK,MANAGER,PERSIDENT,SALESMAN这是job列所有可能取的值,上面只列举了9行,可能有10多W行。1代表取该值,0代表不取,比如第八行取值为ANALYST,第一行为CLERK。这个时候,如果我们想查找值为CLERK的所有行数据,很容易就查得出来。

 

       位图索引使用场景

       位图索引对于相异基数低的数据最为合适,相异基数低是相对而言,4000行的数据,2是相异基数。只有2行的表,1当然不是相异基数。也就是如果某一列只可能取几个值,而且这个表的数据量又比较大,那么这一列就适合建立一个位图索引。

      对于数据仓库和即席查询,一般使用位图索引。另外,位图索引适合读密度高的系统,不适合写高密度的系统。因为修改一行,就会锁定上面的位图索引所指向的上所有行数据(可能好几百行)。因为位图索引的一个索引指向的是多行数据,而不是像普通索引那样只指向一行数据。

 

 

 

你可能感兴趣的:(oracle)