ORACLE 表如何count最快?

来源:互联网 发布:11月份宏观经济数据 编辑:程序博客网 时间:2024/05/17 06:21

前言

      ORACLE  count计数最快的方法是使用有BITMAP索引的列,但测试时,ORACLE会自动选择有位图索引的列,count(1)和count(*)均会自动选择有BITMAP索引的列。如果HINT提示指定的索引列为非BITMAP索引,依然可能会被ORACLE忽略!

      例如:SELECT /*+ INDEX(T,IDX_T_ZYFL)*/ COUNT(T.OBJ_ID) FROM T_GZPJL2 T;

T_GZPJL2 表总记录数698868条, ZYFL字段只有3个值,而索引为普通索引,被ORACLE忽略。

问答

1、在Oracle中如何获取表的记录数,最快的是count(*),count(1)还是count(【某个字段】)呢?

答案是:count()有索引的字段比count没有索引的字段块。


2、为什么测试的时候count(*)和count(1)测试效果一样?

答案是:ORACLE 10g以上的版本基于成本的优化器自己做出了选择,总是选择有索引的列进行计数。


3、不管是什么索引,count()速度都一样快吗?

答案是:否!使用位图索引的计数最快,使用B+数索引(普通索引)的次之,性能相差可达1个数量级以上。


4、count()时使用提示(hint),ORACLE一定会使用给定的索引?

答案是:否!如果表已建位图索引,即使你指定了其他非位图索引,ORACLE仍然会倔强地使用BITMAP索引。


结论

    ORACLE中表count()时,使用有位图索引的字段(ORACLE 10g 以上版本优化器会自动选择)最快,其他索引次之,但位图索引的副作用是在巨量数据情况下,可能会影响插入或更新性能。



0 0