本帖最后由 sunqiusong 于 2010-11-17 20:14:56 编辑

解决方案 »

  1.   

    count(*) oracle 需要读取数据字典,去把*解析成具体的字段,这个会导致解析的代价。
      

  2.   

    第二个问题。。我个人觉得count(1)应该是统计的某个伪列,你要不把rowid上建立个索引试下
      

  3.   

    select count(1) from fx_bookinfo
    1 DB CPU 0.035 77.1
    2 parse time elapsed 0.03 65.3
    3 hard parse elapsed time 0.026 56.6
    4 sql execute elapsed time 0.015 33
    5 PL/SQL compilation elapsed time 0.004 10.3
    6 connection management call elapsed time 0.003 7.1
    7 PL/SQL execution elapsed time 0.001 2.9
    8 repeated bind elapsed time 0 0.4
    select count(1) from fx_bookinfo
    1 DB CPU 0.04 79.4
    2 parse time elapsed 0.031 61
    3 hard parse elapsed time 0.026 52.2
    4 sql execute elapsed time 0.018 36
    5 PL/SQL compilation elapsed time 0.004 9.3
    6 connection management call elapsed time 0.003 6.4
    7 PL/SQL execution elapsed time 0.001 3
    8 repeated bind elapsed time 0 0.3
    按你的说法测试发现确实是解析上存在时间差。呵呵,给分
      

  4.   

    按你的说法,没法子对这个物化视图的rowid创建索引,会报错的
      

  5.   

    要是那个count(主键) 这个会走索引吗?
      

  6.   

    1、count(1)和count(*)没有什么区别,不信可以自己去做实险,过多的讨论没有必要。
    2、如果count(索引字段)利用上索引与count(*)是有区别的,区别是性能上前者使用索引肯定快,另外两者结果并不一定等价(如果索引字段有值为null的情况下,count(索引字段)是对null值的行不记数,而count(*)要记数)
      

  7.   

    刚刚找了下。 count(expression)是返回每行中表达式中不为null的总数,所以这里的表达式子
    相当一个函数,所以你不走索引。
      

  8.   

    顶下8楼.一直有个疑问,count(主键)和count(*)谁更快.
      

  9.   

    count(*)强制走全表扫描的话.刚试了下count(*)貌似也会用到索引.
      

  10.   

    对于数据量较大情况,count(主键)比count(*)要块
      

  11.   

    count(*) count(1) 差不多但是count(主键)就不一样 快些