停止空想

老张的空中之家

返回了一行,为何card不为1?

作者:admin 发表时间:六月 - 5 - 2006

ops$tkyte@ORA920> select * from t where object_id = 55;

 

Execution Plan

———————————————————-

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=13 Bytes=96)

   1    0   TABLE ACCESS (BY INDEX ROWID) OF ‘T’ (Cost=3 Card=13 Bytes=96)

   2    1     INDEX (RANGE SCAN) OF ‘T_IDX’ (NON-UNIQUE) (Cost=13 Card=1)

 

Statistics

———————————————————-

          0  recursive calls

          0  db block gets

        11  consistent gets

        82  physical reads

        54  redo size

        209  bytes sent via SQL*Net to client

        275  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

 

其中的card是row的意思。

 

但如果比如上面的sql语句,只能有一行返回,card却等于了一个不是1的数字,这就有问题了。这是因为:

 

如果rows processed(确切的返回的行的数目),与card的数目相差的很远的情况下,可能的原因是:统计数据不足,这个时候需要建立histogram

 

当然这也反映了,autotrace的card是估计的。而trace sql通过tkprof看到的是真实的情况。

 
类别:Oracle

发表评论