天天看點

v$filestat中PHYRDS負值

通過set autotrace 的執行計劃看出查詢v$filestat實際上是查詢了X$KCFIO,X$KCCFE

SQL> set autotrace on;

SQL> Select  file#,phyrds,phywrts from v$filestat;

FILE#     PHYRDS    PHYWRTS

----- ---------- ----------

    1     175397      12846

    2       6838      41451

    3     102878      51928

    4        722         81

    5     983802      19167

    6     310961      16126

    7     339664      18688

    8     204042      16283

    9      27524        436

   10      26169        647

   ......

   22   -1509449799  4298715

   ......

執行計劃

--------------------------------------------------------------------------------

| Id  | Operation                | Name            | Rows  | Bytes | Cost (%CPU)

--------------------------------------------------------------------------------

|   0 | SELECT STATEMENT         |                 |     1 |    78 |     0   (0)

|   1 |  NESTED LOOPS            |                 |     1 |    78 |     0   (0)

|   2 |   FIXED TABLE FULL       | X$KCFIO         |     1 |    52 |     0   (0)

|   3 |   FIXED TABLE FIXED INDEX| X$KCCFE (ind:1) |     1 |    26 |     0   (0)

--------------------------------------------------------------------------------

Note

-----

   - 'PLAN_TABLE' is old version

統計資訊

----------------------------------------------------

    8  recursive calls

    0  db block gets

    2  consistent gets

    0  physical reads

    0  redo size

  834  bytes sent via SQL*Net to client

  257  bytes received via SQL*Net from client

    4  SQL*Net roundtrips to/from client

    0  sorts (memory)

    0  sorts (disk)

   34  rows processed

-- v$fixed_view_definition中看出V$FILESTAT是基于GV$FILESTAT的視圖

SQL> select * from v$fixed_view_definition where VIEW_NAME = 'V$FILESTAT';

VIEW_NAME

------------------------------

VIEW_DEFINITION

--------------------------------------------------------------------------------

V$FILESTAT

select  FILE# , PHYRDS , PHYWRTS , PHYBLKRD , PHYBLKWRT , SINGLEBLKRDS,  READTIM

 , WRITETIM, SINGLEBLKRDTIM, AVGIOTIM, LSTIOTIM, MINIOTIM, MAXIORTM,  MAXIOWTM f

rom GV$FILESTAT where inst_id = USERENV('Instance')

-- 而GV$FILESTAT是由x$kcfio k,x$kccfe建立的視圖

SQL> select * from v$fixed_view_definition where VIEW_NAME='GV$FILESTAT';

VIEW_NAME

------------------------------

VIEW_DEFINITION

--------------------------------------------------------------------------------

GV$FILESTAT

select k.inst_id, k.kcfiofno,k.kcfiopyr,k.kcfiopyw,k.kcfiopbr,k.kcfiopbw, k.kcfi

osbr,k.kcfioprt,k.kcfiopwt,k.kcfiosbt,k.kcfioavg,k.kcfiolst,k.kcfiomin, k.kcfior

mx,k.kcfiowmx from x$kcfio k,x$kccfe f where f.fedup <> 0 and  f.fenum=k.kcfiofno

這個就是通路V$FILESTAT 在執行計劃中看到x$kcfio k,x$kccfe  表的原因,

因為V$FILESTAT是基于x$kcfio k,x$kccfe 定義的。

--可以看出 X$KCFIO中 KCFIOPYR是NUMBER類型的

SQL> desc X$KCFIO

 名稱          是否為空? 類型

 ------------- -------- ------------

 ADDR                   RAW(8)

 INDX                   NUMBER

 INST_ID                NUMBER

 KCFIOFNO               NUMBER

 KCFIOPYR               NUMBER

 KCFIOPYW               NUMBER

 KCFIOSBR               NUMBER

 KCFIOPRT               NUMBER

 KCFIOPWT               NUMBER

 KCFIOSBT               NUMBER

 KCFIOPBR               NUMBER

 KCFIOPBW               NUMBER

 KCFIOCRTR              NUMBER

 KCFIOCURTR             NUMBER

 KCFIOAVG               NUMBER

 KCFIOLST               NUMBER

 KCFIOMIN               NUMBER

 KCFIORMX               NUMBER

 KCFIOWMX               NUMBER

 KCFIOMBR               NUMBER

 KCFIOMBT               NUMBER

 KCFIOCTS               NUMBER

-- v$filestat中PHRDS也是NUMBER類型

SQL> desc v$filestat

 名稱             是否為空? 類型

 ---------------- -------- --------

 FILE#                     NUMBER

 PHYRDS                    NUMBER

 PHYWRTS                   NUMBER

 PHYBLKRD                  NUMBER

 PHYBLKWRT                 NUMBER

 SINGLEBLKRDS              NUMBER

 READTIM                   NUMBER

 WRITETIM                  NUMBER

 SINGLEBLKRDTIM            NUMBER

 AVGIOTIM                  NUMBER

 LSTIOTIM                  NUMBER

 MINIOTIM                  NUMBER

 MAXIORTM                  NUMBER

 MAXIOWTM                  NUMBER

oracle文檔中對PHYRDS的解釋是Number of physical reads done

我了解為實體讀的數量。理論上應該不是負值。出現了負值我認為應該:

1.分散IO.

  可能是這個資料檔案上的實體讀太多了,把這個資料檔案上的表move到其它的表空間一部分。

2.優化SQL

找到這個表空間全表掃描多的sql,進行優化。