通過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,進行優化。