-- +----------------------------------------------------------------------------+
-- |                          Jeffrey M. Hunter                                 |
-- |                      jhunter@idevelopment.info                             |
-- |                         www.idevelopment.info                              |
-- |----------------------------------------------------------------------------|
-- |      Copyright (c) 1998-2011 Jeffrey M. Hunter. All rights reserved.       |
-- |----------------------------------------------------------------------------|
-- | DATABASE : Oracle                                                          |
-- | FILE     : perf_file_io.sql                                                |
-- | CLASS    : Tuning                                                          |
-- | PURPOSE  : Reports on Read/Write datafile activity. This script was        |
-- |            designed to work with Oracle8i or higher. It will include all   |
-- |            tablespaces using any type of extent management as well as true |
-- |            TEMPORARY tablespaces. (i.e. use of "tempfiles")                |
-- | NOTE     : As with any code, ensure to test this script in a development   |
-- |            environment before attempting to run it in production.          |
-- +----------------------------------------------------------------------------+

SET LINESIZE 145
SET PAGESIZE 9999
SET VERIFY   off

COLUMN ts_name    FORMAT a15          HEAD 'Tablespace'
COLUMN fname      FORMAT a45          HEAD 'File Name'
COLUMN phyrds     FORMAT 999,999,999  HEAD 'Physical Reads'
COLUMN phywrts    FORMAT 999,999,999  HEAD 'Physical Writes'
COLUMN read_pct   FORMAT 999.99       HEAD 'Read Pct.'
COLUMN write_pct  FORMAT 999.99       HEAD 'Write Pct.'

BREAK ON report
COMPUTE SUM OF phyrds     ON report
COMPUTE SUM OF phywrts    ON report
COMPUTE AVG OF read_pct   ON report
COMPUTE AVG OF write_pct  ON report

SELECT
    df.tablespace_name                       ts_name
  , df.file_name                             fname
  , fs.phyrds                                phyrds
  , (fs.phyrds * 100) / (fst.pr + tst.pr)    read_pct
  , fs.phywrts                               phywrts
  , (fs.phywrts * 100) / (fst.pw + tst.pw)   write_pct
FROM
    sys.dba_data_files df
  , v$filestat         fs
  , (select sum(f.phyrds) pr, sum(f.phywrts) pw from v$filestat f) fst
  , (select sum(t.phyrds) pr, sum(t.phywrts) pw from v$tempstat t) tst
WHERE
    df.file_id = fs.file#
UNION
SELECT
    tf.tablespace_name                     ts_name
  , tf.file_name                           fname
  , ts.phyrds                              phyrds
  , (ts.phyrds * 100) / (fst.pr + tst.pr)  read_pct
  , ts.phywrts                             phywrts
  , (ts.phywrts * 100) / (fst.pw + tst.pw) write_pct
FROM
    sys.dba_temp_files  tf
  , v$tempstat          ts
  , (select sum(f.phyrds) pr, sum(f.phywrts) pw from v$filestat f) fst
  , (select sum(t.phyrds) pr, sum(t.phywrts) pw from v$tempstat t) tst
WHERE
    tf.file_id = ts.file#
ORDER BY phyrds DESC
/

