@@header

/*
*
*  Author     : Vishal Gupta
*  Purpose    : Display Tablespace usage history from AWR repository
*  Parameters : 1 - tablespace_name (Use % as wildcard, Default value '%')
*               2 - Number of days  (Default value '3')
*
*  Revision History:
*  ===================
*  Date       Author        Description
*  ---------  ------------  -----------------------------------------
*  27-Jan-17  Vishal Gupta  Create copy from awr_tbs.sql to show midnight sizes
*  12-Apr-16  Vishal Gupta  Changed script to make it compatible with 10g
*  03-Sep-14  Vishal Gupta  Created
*
*/

/************************************
*  INPUT PARAMETERS
************************************/

UNDEFINE tablespace_name
UNDEFINE days
UNDEFINE WHERECLAUSE

DEFINE   tablespace_name="&&1"  
DEFINE   days="&&2"  
DEFINE   WHERECLAUSE="&&3"  

set term off
COLUMN  _TABLESPACE_NAME          NEW_VALUE  TABLESPACE_NAME             NOPRINT
COLUMN  _DAYS                     NEW_VALUE  DAYS                        NOPRINT

SELECT UPPER(DECODE('&&TABLESPACE_NAME','','%','&&TABLESPACE_NAME'))   "_TABLESPACE_NAME"
     , UPPER(DECODE('&&DAYS','','3','&&DAYS'))                         "_DAYS" 
FROM DUAL;
set term on


/************************************
*  CONFIGURATION PARAMETERS
************************************/
DEFINE BYTES_FORMAT="999,999"
--DEFINE BYTES_HEADING="KB"
--DEFINE BYTES_DIVIDER="1024"
DEFINE BYTES_HEADING="MB"
DEFINE BYTES_DIVIDER="1024/1024"
--DEFINE BYTES_HEADING="GB"
--DEFINE BYTES_DIVIDER="1024/1024/1024"

DEFINE LARGE_BYTES_FORMAT="9,999,999"
--DEFINE LARGE_BYTES_HEADING="KB"
--DEFINE LARGE_BYTES_DIVIDER="1024"
DEFINE LARGE_BYTES_HEADING="MB"
DEFINE LARGE_BYTES_DIVIDER="1024/1024"
--DEFINE LARGE_BYTES_HEADING="GB"
--DEFINE LARGE_BYTES_DIVIDER="1024/1024/1024"


PROMPT *****************************************************************
PROMPT *  T A B L E S P A C E   U S A G E   H I S T O R Y   
PROMPT * 
PROMPT * Input Parameters 
PROMPT *  - Tablespace Name = '&&TABLESPACE_NAME'
PROMPT *  - Days            = '&&DAYS'
PROMPT *  - WHERECLAUSE    = "&&WHERECLAUSE"
PROMPT *****************************************************************


COLUMN end_interval_time   HEADING "Timestamp"                            FORMAT a15
COLUMN tsname              HEADING "Tablespace Name"                      FORMAT a30
COLUMN alloc               HEADING "Alloc|(&&LARGE_BYTES_HEADING)"        FORMAT &&LARGE_BYTES_FORMAT ON
COLUMN used                HEADING "Used|(&&BYTES_HEADING)"               FORMAT &&BYTES_FORMAT ON
COLUMN free                HEADING "Free|(&&BYTES_HEADING)"               FORMAT &&BYTES_FORMAT ON
COLUMN MAXAlloc            HEADING "Max|Alloc|(&&LARGE_BYTES_HEADING)"    FORMAT &&LARGE_BYTES_FORMAT ON
COLUMN MAXUsed             HEADING "Max|Used|(&&BYTES_HEADING)"           FORMAT &&BYTES_FORMAT ON
COLUMN MAXFree             HEADING "Max|Free|(&&BYTES_HEADING)"           FORMAT &&BYTES_FORMAT ON
COLUMN used_percent        HEADING "Used|(%)"                             FORMAT 999.9 ON
COLUMN free_percent        HEADING "Free|(%)"                             FORMAT 999.9 ON
COLUMN max_used_percent    HEADING "Max|Used|(%)"                         FORMAT 999.9 ON
COLUMN max_free_percent    HEADING "Max|Free|(%)"                         FORMAT 999.9 ON
COLUMN prev_alloc          HEADING "Prev|Alloc|(&&BYTES_HEADING)"         FORMAT &&BYTES_FORMAT ON
COLUMN prev_Used           HEADING "Prev|Used|(&&BYTES_HEADING)"          FORMAT &&BYTES_FORMAT ON
COLUMN prev_MAXSize        HEADING "Prev|MaxSize|(&&BYTES_HEADING)"       FORMAT &&BYTES_FORMAT ON
COLUMN size_diff           HEADING "Alloc|Increase|(&&BYTES_HEADING)"     FORMAT &&BYTES_FORMAT ON
COLUMN usedsize_diff       HEADING "Used|Increase|(&&BYTES_HEADING)"      FORMAT &&BYTES_FORMAT ON
COLUMN maxsize_diff        HEADING "MaxSize|Increase|(&&BYTES_HEADING)"   FORMAT &&BYTES_FORMAT ON
COLUMN separator           HEADING "!|!|!"                                FORMAT A1 ON

WITH tbspc_space_usage AS
(SELECT su.* 
     , t.tsname
     , p.VALUE block_size
     , LAG (su.tablespace_size) OVER (PARTITION BY su.dbid, su.tablespace_id ORDER BY TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS') ) prev_tablespace_size
     , LAG (su.tablespace_usedsize) OVER (PARTITION BY su.dbid, su.tablespace_id ORDER BY TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS') ) prev_tablespace_usedsize
     , LAG (su.tablespace_maxsize) OVER (PARTITION BY su.dbid, su.tablespace_id ORDER BY TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS') ) prev_tablespace_maxsize
FROM dba_hist_tbspc_space_usage su
   , dba_hist_tablespace t
   , v$system_parameter p
   , v$database d
WHERE su.dbid = d.dbid
AND   su.dbid           = t.dbid
AND   su.tablespace_id  = t.ts#
AND   p.NAME = 'db_block_size'
AND   UPPER(t.tsname) LIKE UPPER('&&TABLESPACE_NAME') ESCAPE '\'
AND  TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS') > SYSDATE - &&DAYS
)
SELECT /* Not using hints --FIRST_ROWS NO_MERGE USE_NL(su t ) LEADING(su) */
       TO_CHAR(TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS'),'DD-MON-YY HH24:MI')                      end_interval_time
     , su.tsname
     , '!'                                                                                         separator
     , (ROUND(su.tablespace_size*su.block_size/&&LARGE_BYTES_DIVIDER))                             alloc
     , (ROUND(su.tablespace_usedsize*su.block_size/&&BYTES_DIVIDER))                               Used
     , (ROUND((su.tablespace_size - su.tablespace_usedsize)*su.block_size/&&BYTES_DIVIDER))        free
     , ROUND((su.tablespace_usedsize/su.tablespace_size)*100,2)                                    used_percent
     , ROUND(((su.tablespace_size - su.tablespace_usedsize)/su.tablespace_size)*100,2)             free_percent
     , '!'                                                                                         separator
     , (ROUND(su.tablespace_maxsize*su.block_size/&&LARGE_BYTES_DIVIDER))                          MAXAlloc
     , (ROUND((su.tablespace_maxsize - su.tablespace_usedsize)*su.block_size/&&BYTES_DIVIDER))     MAXFree
     , ROUND((su.tablespace_usedsize/su.tablespace_maxsize)*100,2)                                 max_used_percent
     , ROUND(((su.tablespace_maxsize - su.tablespace_usedsize)/su.tablespace_maxsize)*100,2)       max_free_percent
     --, (ROUND(su.prev_tablespace_size*su.block_size/&&BYTES_DIVIDER))                              prev_alloc
     --, (ROUND(su.prev_tablespace_usedsize*su.block_size/&&BYTES_DIVIDER))                          prev_Used
     --, (ROUND(su.prev_tablespace_maxsize*su.block_size/&&BYTES_DIVIDER))                           prev_MAXSize
     , '!'                                                                                         separator
     , ROUND((su.tablespace_size - su.prev_tablespace_size)*su.block_size/&&BYTES_DIVIDER)         size_diff
     , ROUND((su.tablespace_usedsize - su.prev_tablespace_usedsize)*su.block_size/&&BYTES_DIVIDER) usedsize_diff
     , ROUND((su.tablespace_maxsize - su.prev_tablespace_maxsize)*su.block_size/&&BYTES_DIVIDER)   maxsize_diff
FROM tbspc_space_usage su
WHERE 1=1
  AND ( 
       --(   ROUND((su.tablespace_size - su.prev_tablespace_size)*su.block_size/1024/1024) <> 0
       -- OR ROUND((su.tablespace_usedsize - su.prev_tablespace_usedsize)*su.block_size/1024/1024) <> 0
       -- OR ROUND((su.tablespace_maxsize - su.prev_tablespace_maxsize)*su.block_size/1024/1024) <> 0
       -- )
       --OR
       TO_CHAR(TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS'),'HH24:MI')  = '00:00'
      )
  &&WHERECLAUSE
ORDER BY TO_DATE(su.rtime,'MM/DD/YYYY HH24:MI:SS')
;

@@footer
