@@header
set term off
/*
*
*  Author  : Vishal Gupta
*  Purpose : Display sql capture histograms (equi-width buckets) from statspack repository
*  Paraemter: 1 - bucket number (default value 20)
*             2 - threshold multiplier (default value 10)
*
*  Revision History:
*  ===================
*  Date       Author        Description
*  ---------  ------------  -----------------------------------------
*  05-Aug-07  Vishal Gupta  First Draft
*
*
*/
set term on

set lines 200
set pages 50

define bucket_numbers="&&1"
define threshold_multiplier="&&2"

COLUMN executions_bucket_ceil     	HEADING "Executions|Bucket Ceil"    FORMAT 999,999 ON
COLUMN parse_calls_bucket_ceil     	HEADING "ParseCalls|Bucket Ceil"    FORMAT 999,999 ON
COLUMN disk_reads_bucket_ceil     	HEADING "DiskReads|Bucket Ceil"     FORMAT 999,999,999 ON
COLUMN buffer_gets_bucket_ceil     	HEADING "BufferGets|Bucket Ceil"    FORMAT 999,999,999 ON
COLUMN sharable_mem_bucket_ceil     	HEADING "SharableMem|Bucket Ceil"   FORMAT 999,999,999 ON
COLUMN version_count_bucket_ceil        HEADING "Version|Bucket Ceil"       FORMAT 999,999 ON

COLUMN executions_Count     	        HEADING "Executions|Count"          FORMAT 999,999 ON
COLUMN parse_calls_Count     	        HEADING "ParseCalls|Count"          FORMAT 999,999 ON
COLUMN disk_reads_Count     	        HEADING "DiskReads|Count"           FORMAT 999,999 ON
COLUMN buffer_gets_Count     	        HEADING "BufferGets|Count"          FORMAT 999,999 ON
COLUMN sharable_mem_Count     	        HEADING "SharableMem|Count"         FORMAT 999,999 ON
COLUMN version_count_Count              HEADING "Version|Count"             FORMAT 999,999 ON

COLUMN executions_percent     	        HEADING "Executions|% Records"        FORMAT 999.99 ON
COLUMN parse_calls_percent     	        HEADING "ParseCalls|% Records"        FORMAT 999.99 ON
COLUMN disk_reads_percent     	        HEADING "DiskReads|% Records"         FORMAT 999.99 ON
COLUMN buffer_gets_percent     	        HEADING "BufferGets|% Records"        FORMAT 999.99 ON
COLUMN sharable_mem_percent             HEADING "SharableMem|% Records"       FORMAT 999.99 ON
COLUMN version_count_percent            HEADING "Version|% Records"           FORMAT 999.99 ON



with 
/* Define the constants for this script */
constants as
(select NVL(&bucket_numbers,20)       bucket_numbers        -- number of width balanced histograms
      , NVL(&threshold_multiplier,10) threshold_multiplier  -- statspack parameter threshold multipler
  from dual),
/* Define the constants for this script */
buckets as
(SELECT ss.SNAP_ID 
     , WIDTH_BUCKET(ss.executions   , 0, sp.EXECUTIONS_TH    * c.threshold_multiplier, c.bucket_numbers ) executions_BUCKET_num
     , WIDTH_BUCKET(ss.parse_calls  , 0, sp.PARSE_CALLS_TH   * c.threshold_multiplier, c.bucket_numbers ) parse_calls_BUCKET_num
     , WIDTH_BUCKET(ss.disk_reads   , 0, sp.DISK_READS_TH    * c.threshold_multiplier, c.bucket_numbers ) disk_reads_BUCKET_num
     , WIDTH_BUCKET(ss.buffer_gets  , 0, sp.BUFFER_GETS_TH   * c.threshold_multiplier, c.bucket_numbers ) buffer_gets_BUCKET_num
     , WIDTH_BUCKET(ss.sharable_mem , 0, sp.SHARABLE_MEM_TH  * c.threshold_multiplier, c.bucket_numbers ) sharable_mem_BUCKET_num
     , WIDTH_BUCKET(ss.version_count, 0, sp.VERSION_COUNT_TH * c.threshold_multiplier, c.bucket_numbers ) version_count_BUCKET_num
     , WIDTH_BUCKET(ss.executions   , 0, sp.EXECUTIONS_TH    * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.EXECUTIONS_TH * c.threshold_multiplier)/c.bucket_numbers) executions_BUCKET_ceil
     , WIDTH_BUCKET(ss.parse_calls  , 0, sp.PARSE_CALLS_TH   * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.PARSE_CALLS_TH * c.threshold_multiplier)/c.bucket_numbers) parse_calls_BUCKET_ceil
     , WIDTH_BUCKET(ss.disk_reads   , 0, sp.DISK_READS_TH    * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.DISK_READS_TH * c.threshold_multiplier)/c.bucket_numbers) disk_reads_BUCKET_ceil
     , WIDTH_BUCKET(ss.buffer_gets  , 0, sp.BUFFER_GETS_TH   * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.BUFFER_GETS_TH * c.threshold_multiplier)/c.bucket_numbers) buffer_gets_BUCKET_ceil
     , WIDTH_BUCKET(ss.sharable_mem , 0, sp.SHARABLE_MEM_TH  * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.SHARABLE_MEM_TH * c.threshold_multiplier)/c.bucket_numbers) sharable_mem_BUCKET_ceil
     , WIDTH_BUCKET(ss.version_count, 0, sp.VERSION_COUNT_TH * c.threshold_multiplier, c.bucket_numbers ) 
                                        * ( (sp.VERSION_COUNT_TH * c.threshold_multiplier)/c.bucket_numbers) version_count_BUCKET_ceil
  FROM stats$sql_summary ss  
     , stats$statspack_parameter sp
     , v$database d
     , v$instance i
     , constants c
 WHERE ss.dbid = d.dbid
   AND ss.instance_number = i.instance_number
   AND sp.dbid = d.dbid
   AND sp.instance_number = i.instance_number
    ), 
executions_buckets as 
     ( select rownum lv_rownum, a1.* from  (select executions_BUCKET_num, executions_BUCKET_ceil, count(1) count
       from buckets group by executions_BUCKET_num, executions_BUCKET_ceil order by 1)   a1 ) ,
parse_calls_buckets as      
     ( select rownum lv_rownum, a2.* from (select parse_calls_BUCKET_num, parse_calls_BUCKET_ceil, count(1) count
       from buckets group by parse_calls_BUCKET_num, parse_calls_BUCKET_ceil order by 1) a2 ) ,
disk_reads_buckets as
     ( select rownum lv_rownum, a3.* from (select disk_reads_BUCKET_num, disk_reads_BUCKET_ceil, count(1) count
       from buckets group by disk_reads_BUCKET_num, disk_reads_BUCKET_ceil order by 1)   a3 ) ,
buffer_gets_buckets as
     ( select rownum lv_rownum, a4.* from (select buffer_gets_BUCKET_num, buffer_gets_BUCKET_ceil, count(1) count
       from buckets group by buffer_gets_BUCKET_num,buffer_gets_BUCKET_ceil order by 1)  a4 ) ,
sharable_mem_buckets as
     ( select rownum lv_rownum, a5.* from (select sharable_mem_BUCKET_num, sharable_mem_BUCKET_ceil, count(1) count
       from buckets group by sharable_mem_BUCKET_num, sharable_mem_BUCKET_ceil order by 1)   a5 ) ,
version_count_buckets as
     ( select rownum lv_rownum, a6.* from (select version_count_BUCKET_num, version_count_BUCKET_ceil, count(1) count
       from buckets group by version_count_BUCKET_num, version_count_BUCKET_ceil order by 1) a6 )
select  e.executions_bucket_ceil     
      , p.parse_calls_BUCKET_ceil
      , d.disk_reads_BUCKET_ceil
      , b.buffer_gets_BUCKET_ceil
      , s.sharable_mem_BUCKET_ceil
      , v.version_count_BUCKET_ceil
--      , e.count executions_count    
--      , p.count parse_calls_count   
--      , d.count disk_reads_count    
--      , b.count buffer_gets_count   
--      , s.count sharable_mem_count  
--      , v.count version_count_count 
      , ROUND((e.count / total_count)*100,2) executions_percent
      , ROUND((p.count / total_count)*100,2) parse_calls_percent
      , ROUND((d.count / total_count)*100,2) disk_reads_percent
      , ROUND((b.count / total_count)*100,2) buffer_gets_percent
      , ROUND((s.count / total_count)*100,2) sharable_mem_percent
      , ROUND((v.count / total_count)*100,2) version_count_percent
 from executions_buckets    e
    , parse_calls_buckets   p
    , disk_reads_buckets    d
    , buffer_gets_buckets   b
    , sharable_mem_buckets  s
    , version_count_buckets v
    , (select count(1) total_count 
         from stats$sql_summary ss , v$instance i , v$database d
        WHERE ss.dbid = d.dbid
          AND ss.instance_number = i.instance_number
       ) 
where e.lv_rownum = p.lv_rownum (+) 
  and e.lv_rownum = d.lv_rownum (+)
  and e.lv_rownum = b.lv_rownum (+)
  and e.lv_rownum = s.lv_rownum (+)
  and e.lv_rownum = v.lv_rownum (+)
order by 1  
/

@@footer
