Oracle优化问题?? 
我有一个表PO,有3万多条记录。Create Table PO(
PO_KEY number, 
...,
constraint pk_po primary key(po_key))就是PO_KEY是主键我想各位帮我分析下面两个查询一致性读差别这么大,理论上说应该不大的。select count(*) from POExecution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1 Bytes=7)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'PK_PO' (UNIQUE) (Cost=8 Card=
30144 Bytes=211008)Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
68 consistent gets
0 physical reads
0 redo size
385 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processedSQL> SELECT PO_KEY FROM PO;30144 rows selected.
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=30144 Bytes=
          20576)   1    0   INDEX (FAST FULL SCAN) OF 'PK_PO' (UNIQUE) (Cost=8 Card=3
          144 Bytes=120576)Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       2074  consistent gets
          0  physical reads
          0  redo size
     427286  bytes sent via SQL*Net to client
      22602  bytes received via SQL*Net from client
       2011  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      30144  rows processed
都是从索引中读取数据,为什么差别这么大。
应该一样才对阿。
我看了索引占用的9个extent,每个大小为64K。

解决方案 »

  1.   

    我不太明白你的意思,你指的是什么?你用两个方法查询执行计划,得出的结果不一样呢?还是说,你执行sql 语句后查看的执行计划跟你预先计算的不一致>
      

  2.   

    count(*) 只是计数,所以速度很快, PO_KEY 的话,是需要把所有索引值读取出来然后通过网络把这些字节传给你,当然就慢了
      

  3.   

    count(1)更快,不太明白你的意思。
      

  4.   

    consistent gets, 反应的是逻辑的I/O,是和返回的数据量有关的.试一下这个查询: SELECT PO_KEY FROM PO where 1<2;consistent gets会变得和第一个查询一下小.
      

  5.   

    对于consistent gets oracle的解释有点拗口(还是本人翻译有些欠妥)
    原文是这样的:
      consistent gets  Number of times a consistent read was requested for a
     block
    翻译过来就是:在一致性读的过程中,对于数据块请求的次数.
    需要指出的是coun(*)和读取一般数据的方式是不一样的.  有的时候,仅仅扫描表头即可
    因此自然两个的具体数值是不一样的.