刚刚执行个SQL想看看统计情况,发现竟然物理读和一致读都是0,请高手帮忙解释下,谢谢
SQL> SELECT COUNT(1) FROM t;
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 | 19564   (3)| 00:03:55 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    |    18M| 19564   (3)| 00:03:55 |
-------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        514  bytes sent via SQL*Net to client
        214  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

解决方案 »

  1.   

    表是小表吧
    在select count(*)之前应该执行过select * from t之类的语句,导致表的数据块已经在SGA中了,这样Oracle就不需要物理读了。
      

  2.   

    还有一种情况,比如你刚写入一条记录,然后马上select count(*),这时的记录仍在SGA中,也是不需要物理读的。
      

  3.   


    这个T表记录有一千多万,就算记录在SGA中,consistent gets也应该有值呀。。
      

  4.   

    consistent gets指在回滚段中块数,当你select时,别人正在修改数据块,你确定select时,别人在作这些操作,如果没有,尤其是你的数据已经在SGA的情况下,上述两个参数为0也很正常啊。
      

  5.   

    consistent gets其实是指脏读的块数。也就是,当你select某条记录时,有人在对它进行update,但这个update的人还没有提交,这时Oracle会把update之前的旧记录复制到回滚段上去,select的人看到的是回滚段上的旧记录。因此,如果你select时,没有人执行update,这个参数为0是可以理解的。
    物理读为0应该就是数据已经在SGA中了,对oracle的统计数字还是比较有信心的,因此不怀疑统计的错误。
      

  6.   

    为了验证你的解释,我做了以下测试:
    SQL> create table a as select object_id from dba_objects where object_id=2;Table created.SQL> select * from a; OBJECT_ID
    ----------
             2首先创建一个小表,可以一次将全部数据读入SGA(这个测试库是我自己创建的,我一个人操作,排除其他人对数据的影响) set autotrace trace exp stat;
    SQL> select * from a;
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2248738933--------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    13 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| A    |     1 |    13 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              3  consistent gets
              0  physical reads
              0  redo size
            416  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    由于第一段的select语句,已将a表数据读入buffer cache ,所以这里显示的是 3  consistent gets,并不是你解释那样,只有读回滚段的数据才是consistent gets,而且也没人操作表aSQL> select * from a;
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2248738933--------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    13 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| A    |     1 |    13 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              3  consistent gets
              0  physical reads
              0  redo size
            416  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    接下来不管执行几次select * from a,都是显示 3  consistent gets。所以我认为出现一致读与物理读都为0,并不是楼上解释的那样,还请各位高手帮忙解释下