Files
oracle/star/planx.sql
2026-03-12 21:23:47 +01:00

1410 lines
61 KiB
MySQL

----------------------------------------------------------------------------------------
--
-- File name: planx.sql
--
-- Purpose: Reports Execution Plans for one SQL_ID from RAC and AWR(opt)
--
-- Author: Carlos Sierra
--
-- Version: 2018/01/29
--
-- Usage: This script inputs two parameters. Parameter 1 is a flag to specify if
-- your database is licensed to use the Oracle Diagnostics Pack or not.
-- Parameter 2 specifies the SQL_ID for which you want to report all
-- execution plans from all nodes, plus all plans from AWR.
-- If you don't have the Oracle Diagnostics Pack license, or if you want
-- to omit the AWR portion then specify "N" on Parameter 1.
--
-- Example: @planx.sql Y f995z9antmhxn
--
-- Notes: Developed and tested on 11.2.0.3 and 12.0.1.0
--
-- For a more robust tool use SQLd360
--
---------------------------------------------------------------------------------------
--
SET HEA ON LIN 500 PAGES 100 TAB OFF FEED OFF ECHO OFF VER OFF TRIMS ON TRIM ON TI OFF TIMI OFF;
SET LIN 1000;
SET SERVEROUT OFF;
PRO
PRO 1. Enter Oracle Diagnostics Pack License Flag [ Y | N ] (required)
DEF input_license = '&1.';
PRO
PRO 2. Enter SQL_ID (required)
DEF sql_id = '&2.';
-- set license
VAR license CHAR(1);
BEGIN
SELECT UPPER(SUBSTR(TRIM('&input_license.'), 1, 1)) INTO :license FROM DUAL;
END;
/
-- get dbid
VAR dbid NUMBER;
BEGIN
SELECT dbid INTO :dbid FROM v$database;
END;
/
-- is_10g
DEF is_10g = '';
COL is_10g NEW_V is_10g NOPRI;
SELECT '--' is_10g FROM v$instance WHERE version LIKE '10%';
-- is_11r1
DEF is_11r1 = '';
COL is_11r1 NEW_V is_11r1 NOPRI;
SELECT '--' is_11r1 FROM v$instance WHERE version LIKE '11.1%';
-- is_11r2
DEF is_11r2 = '';
COL is_11r2 NEW_V is_11r2 NOPRI;
SELECT '--' is_11r2 FROM v$instance WHERE version LIKE '11.2%';
-- get current time
COL current_time NEW_V current_time FOR A15;
SELECT 'current_time: ' x, TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') current_time FROM DUAL;
-- set min and max snap id
COL x_minimum_snap_id NEW_V x_minimum_snap_id NOPRI;
SELECT NVL(TO_CHAR(MAX(snap_id)), '0') x_minimum_snap_id FROM dba_hist_snapshot WHERE :license = 'Y' AND begin_interval_time < SYSDATE - 31;
SELECT '-1' x_minimum_snap_id FROM DUAL WHERE TRIM('&&x_minimum_snap_id.') IS NULL;
COL x_maximum_snap_id NEW_V x_maximum_snap_id NOPRI;
SELECT NVL(TO_CHAR(MAX(snap_id)), '&&x_minimum_snap_id.') x_maximum_snap_id FROM dba_hist_snapshot WHERE :license = 'Y';
SELECT '-1' x_maximum_snap_id FROM DUAL WHERE TRIM('&&x_maximum_snap_id.') IS NULL;
COL x_minimum_date NEW_V x_minimum_date NOPRI;
SELECT TO_CHAR(MIN(begin_interval_time), 'YYYY-MM-DD"T"HH24:MI:SS') x_minimum_date FROM dba_hist_snapshot WHERE :license = 'Y' AND snap_id = &&x_minimum_snap_id.;
COL x_maximum_date NEW_V x_maximum_date NOPRI;
SELECT TO_CHAR(MAX(end_interval_time), 'YYYY-MM-DD"T"HH24:MI:SS') x_maximum_date FROM dba_hist_snapshot WHERE :license = 'Y' AND snap_id = &&x_maximum_snap_id.;
-- get sql_text
VAR sql_id VARCHAR2(13);
EXEC :sql_id := '&&sql_id.';
VAR sql_text CLOB;
EXEC :sql_text := NULL;
VAR signature NUMBER;
VAR signaturef NUMBER;
BEGIN
SELECT exact_matching_signature, sql_text INTO :signature, :sql_text FROM gv$sql WHERE sql_id = '&&sql_id.' AND ROWNUM = 1;
END;
/
BEGIN
IF :sql_text IS NULL OR NVL(DBMS_LOB.GETLENGTH(:sql_text), 0) = 0 THEN
SELECT sql_fulltext
INTO :sql_text
FROM gv$sqlstats
WHERE sql_id = :sql_id
AND ROWNUM = 1;
END IF;
END;
/
BEGIN
IF :license = 'Y' AND (:sql_text IS NULL OR NVL(DBMS_LOB.GETLENGTH(:sql_text), 0) = 0) THEN
SELECT sql_text
INTO :sql_text
FROM dba_hist_sqltext
WHERE sql_id = :sql_id
AND ROWNUM = 1;
END IF;
END;
/
BEGIN
IF :signature IS NULL THEN
:signature := NVL(DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text), -1);
END IF;
END;
/
EXEC :signaturef := NVL(DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text, TRUE), -1);
COL signature NEW_V signature FOR A20;
COL signaturef NEW_V signaturef FOR A20;
SELECT TO_CHAR(:signature) signature, TO_CHAR(:signaturef) signaturef FROM DUAL;
BEGIN
IF :sql_text IS NULL THEN
:sql_text := 'Unknown SQL Text';
END IF;
END;
/
COL x_host_name NEW_V x_host_name;
SELECT host_name x_host_name FROM v$instance;
COL x_db_name NEW_V x_db_name;
SELECT name x_db_name FROM v$database;
COL x_container NEW_V x_container;
SELECT 'NONE' x_container FROM DUAL;
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') x_container FROM DUAL;
DEF sql_handle = '';
COL sql_handle NEW_V sql_handle;
SELECT sql_handle FROM dba_sql_plan_baselines WHERE signature = &&signature. AND ROWNUM = 1;
-- spool and sql_text
SPO planx_&&sql_id._&&current_time..txt;
PRO SQL_ID: &&sql_id.
PRO SIGNATURE: &&signature.
PRO SIGNATUREF: &&signaturef.
PRO SQL_HANDLE: &&sql_handle.
PRO HOST: &&x_host_name.
PRO DATABASE: &&x_db_name.
PRO CONTAINER: &&x_container.
PRO
SET PAGES 0;
PRINT :sql_text;
SET PAGES 50;
-- columns funky format
COL action_ff FOR A30 HEA "Action";
COL appl_wait_secs_ff FOR A18 HEA "Appl wait secs";
COL begin_interval_time_ff FOR A20 HEA "Begin interval time";
COL buffer_gets_ff FOR A20 HEA "Buffer Gets";
COL cluster_wait_secs_ff FOR A18 HEA "Cluster wait secs";
COL conc_wait_secs_ff FOR A18 HEA "Conc wait secs";
COL cpu_secs_ff FOR A18 HEA "CPU secs";
COL current_object_ff FOR A60 HEA "Current object";
COL direct_writes_ff FOR A20 HEA "Direct Writes";
COL disk_reads_ff FOR A20 HEA "Disk Reads";
COL elsapsed_secs_ff FOR A18 HEA "Elapsed secs";
COL end_interval_time_ff FOR A20 HEA "End interval time";
COL executions_ff FOR A20 HEA "Executions";
COL fetches_ff FOR A20 HEA "Fetches";
COL first_load_time_ff FOR A20 HEA "First load time";
COL inst_child_ff FOR A21 HEA "Inst child";
COL invalidations_ff FOR A8 HEA "Invalidations";
COL io_cell_offload_eligible_b_ff FOR A30 HEA "IO cell offload eligible bytes";
COL io_cell_offload_returned_b_ff FOR A30 HEA "IO cell offload returned bytes";
COL io_cell_uncompressed_bytes_ff FOR A30 HEA "IO cell uncompressed bytes";
COL io_interconnect_bytes_ff FOR A30 HEA "IO interconnect bytes";
COL io_saved_ff FOR A10 HEA "IO saved";
COL java_exec_secs_ff FOR A18 HEA "Java exec secs";
COL last_active_time_ff FOR A20 HEA "Last active time";
COL last_load_time_ff FOR A20 HEA "Last load time";
COL line_id_ff FOR 9999999 HEA "Line id";
COL loaded_ff FOR A6 HEA "Loaded";
COL loaded_versions_ff FOR A15 HEA "Loaded versions";
COL loads_ff FOR A8 HEA "Loads";
COL module_ff FOR A30 HEA "Module";
COL open_versions_ff FOR A15 HEA "Open versions";
COL operation_ff FOR A50 HEA "Operation";
COL parse_calls_ff FOR A20 HEA "Parse calls";
COL percent_ff FOR 9,990.0 HEA "Percent";
COL persistent_mem_ff FOR A20 HEA "Persistent mem";
COL plan_timestamp_ff FOR A19 HEA "Plan timestamp";
COL plsql_exec_secs_ff FOR A18 HEA "PLSQL exec secs";
COL px_servers_executions_ff FOR A20 HEA "PX servers executions";
COL rows_processed_ff FOR A20 HEA "Rows processed";
COL runtime_mem_ff FOR A20 HEA "Runtime mem";
COL samples_ff FOR 999,999,999,999 HEA "Samples";
COL service_ff FOR A30 HEA "Service";
COL sharable_mem_ff FOR A20 HEA "Sharable mem";
COL sorts_ff FOR A20 HEA "Sorts";
COL sql_profile_ff FOR A30 HEA "SQL Profile";
COL timed_event_ff FOR A70 HEA "Timed event";
COL total_sharable_mem_ff FOR A20 HEA "Total sharable mem";
COL user_io_wait_secs_ff FOR A18 HEA "User IO wait secs";
COL users_executing_ff FOR A15 HEA "Users executing";
COL users_opening_ff FOR A15 HEA "Users opening";
COL version_count_ff FOR A8 HEA "Version count";
COL obsl FOR A4;
COL sens FOR A4;
COL aware FOR A5;
COL shar FOR A4;
COL u_exec FOR 999999;
COL obj_sta FOR A7;
COL plan_name FOR A30;
COL created FOR A30;
COL last_executed FOR A30;
COL avg_et_ms_awr FOR A11 HEA 'ET Avg|AWR (ms)';
COL avg_et_ms_mem FOR A11 HEA 'ET Avg|MEM (ms)';
COL avg_cpu_ms_awr FOR A11 HEA 'CPU Avg|AWR (ms)';
COL avg_cpu_ms_mem FOR A11 HEA 'CPU Avg|MEM (ms)';
COL avg_bg_awr FOR 999,999,990 HEA 'BG Avg|AWR';
COL avg_bg_mem FOR 999,999,990 HEA 'BG Avg|MEM';
COL avg_row_awr FOR 999,999,990 HEA 'Rows Avg|AWR';
COL avg_row_mem FOR 999,999,990 HEA 'Rows Avg|MEM';
COL plan_hash_value FOR 9999999999 HEA 'Plan|Hash Value';
COL executions_awr FOR 999,999,999,999 HEA 'Executions|AWR';
COL executions_mem FOR 999,999,999,999 HEA 'Executions|MEM';
COL min_cost FOR 9,999,999 HEA 'MIN Cost';
COL max_cost FOR 9,999,999 HEA 'MAX Cost';
COL nl FOR 99;
COL hj FOR 99;
COL mj FOR 99;
COL p100_et_ms FOR A11 HEA 'ET 100th|Pctl (ms)';
COL p99_et_ms FOR A11 HEA 'ET 99th|Pctl (ms)';
COL p97_et_ms FOR A11 HEA 'ET 97th|Pctl (ms)';
COL p95_et_ms FOR A11 HEA 'ET 95th|Pctl (ms)';
COL p100_cpu_ms FOR A11 HEA 'CPU 100th|Pctl (ms)';
COL p99_cpu_ms FOR A11 HEA 'CPU 99th|Pctl (ms)';
COL p97_cpu_ms FOR A11 HEA 'CPU 97th|Pctl (ms)';
COL p95_cpu_ms FOR A11 HEA 'CPU 95th|Pctl (ms)';
PRO
PRO PLANS PERFORMANCE
PRO ~~~~~~~~~~~~~~~~~
WITH
pm AS (
SELECT plan_hash_value, operation,
CASE operation WHEN 'NESTED LOOPS' THEN COUNT(DISTINCT id) ELSE 0 END nl,
CASE operation WHEN 'HASH JOIN' THEN COUNT(DISTINCT id) ELSE 0 END hj,
CASE operation WHEN 'MERGE JOIN' THEN COUNT(DISTINCT id) ELSE 0 END mj
FROM gv$sql_plan
WHERE sql_id = TRIM('&&sql_id.')
GROUP BY
plan_hash_value,
operation ),
pa AS (
SELECT plan_hash_value, operation,
CASE operation WHEN 'NESTED LOOPS' THEN COUNT(DISTINCT id) ELSE 0 END nl,
CASE operation WHEN 'HASH JOIN' THEN COUNT(DISTINCT id) ELSE 0 END hj,
CASE operation WHEN 'MERGE JOIN' THEN COUNT(DISTINCT id) ELSE 0 END mj
FROM dba_hist_sql_plan
WHERE sql_id = TRIM('&&sql_id.')
AND :license = 'Y'
GROUP BY
plan_hash_value,
operation ),
pm_pa AS (
SELECT plan_hash_value, MAX(nl) nl, MAX(hj) hj, MAX(mj) mj
FROM pm
GROUP BY
plan_hash_value
UNION
SELECT plan_hash_value, MAX(nl) nl, MAX(hj) hj, MAX(mj) mj
FROM pa
GROUP BY
plan_hash_value ),
p AS (
SELECT plan_hash_value, MAX(nl) nl, MAX(hj) hj, MAX(mj) mj
FROM pm_pa
GROUP BY
plan_hash_value ),
phv_perf AS (
SELECT plan_hash_value,
snap_id,
SUM(elapsed_time_delta)/SUM(executions_delta) avg_et_us,
SUM(cpu_time_delta)/SUM(executions_delta) avg_cpu_us
FROM dba_hist_sqlstat
WHERE sql_id = TRIM('&&sql_id.')
AND executions_delta > 0
AND optimizer_cost > 0
AND :license = 'Y'
GROUP BY
plan_hash_value,
snap_id ),
phv_stats AS (
SELECT plan_hash_value,
MAX(avg_et_us) p100_et_us,
PERCENTILE_DISC(0.99) WITHIN GROUP (ORDER BY avg_et_us) p99_et_us,
PERCENTILE_DISC(0.97) WITHIN GROUP (ORDER BY avg_et_us) p97_et_us,
PERCENTILE_DISC(0.95) WITHIN GROUP (ORDER BY avg_et_us) p95_et_us,
MAX(avg_cpu_us) p100_cpu_us,
PERCENTILE_DISC(0.99) WITHIN GROUP (ORDER BY avg_cpu_us) p99_cpu_us,
PERCENTILE_DISC(0.97) WITHIN GROUP (ORDER BY avg_cpu_us) p97_cpu_us,
PERCENTILE_DISC(0.95) WITHIN GROUP (ORDER BY avg_cpu_us) p95_cpu_us
FROM phv_perf
GROUP BY
plan_hash_value ),
m AS (
SELECT plan_hash_value,
SUM(elapsed_time)/SUM(executions) avg_et_us,
SUM(cpu_time)/SUM(executions) avg_cpu_us,
ROUND(SUM(buffer_gets)/SUM(executions)) avg_buffer_gets,
ROUND(SUM(rows_processed)/SUM(executions)) avg_rows_processed,
SUM(executions) executions,
MIN(optimizer_cost) min_cost,
MAX(optimizer_cost) max_cost
FROM gv$sql
WHERE sql_id = TRIM('&&sql_id.')
AND executions > 0
AND optimizer_cost > 0
GROUP BY
plan_hash_value ),
a AS (
SELECT plan_hash_value,
SUM(elapsed_time_delta)/SUM(executions_delta) avg_et_us,
SUM(cpu_time_delta)/SUM(executions_delta) avg_cpu_us,
ROUND(SUM(buffer_gets_delta)/SUM(executions_delta)) avg_buffer_gets,
ROUND(SUM(rows_processed_delta)/SUM(executions_delta)) avg_rows_processed,
SUM(executions_delta) executions,
MIN(optimizer_cost) min_cost,
MAX(optimizer_cost) max_cost
FROM dba_hist_sqlstat
WHERE sql_id = TRIM('&&sql_id.')
AND executions_delta > 0
AND optimizer_cost > 0
AND :license = 'Y'
GROUP BY
plan_hash_value )
SELECT
p.plan_hash_value,
LPAD(TRIM(TO_CHAR(ROUND(a.avg_et_us/1e3, 6), '9999,990.000')), 11) avg_et_ms_awr,
LPAD(TRIM(TO_CHAR(ROUND(m.avg_et_us/1e3, 6), '9999,990.000')), 11) avg_et_ms_mem,
LPAD(TRIM(TO_CHAR(ROUND(a.avg_cpu_us/1e3, 6), '9999,990.000')), 11) avg_cpu_ms_awr,
LPAD(TRIM(TO_CHAR(ROUND(m.avg_cpu_us/1e3, 6), '9999,990.000')), 11) avg_cpu_ms_mem,
a.avg_buffer_gets avg_bg_awr,
m.avg_buffer_gets avg_bg_mem,
a.avg_rows_processed avg_row_awr,
m.avg_rows_processed avg_row_mem,
a.executions executions_awr,
m.executions executions_mem,
LEAST(NVL(m.min_cost, a.min_cost), NVL(a.min_cost, m.min_cost)) min_cost,
GREATEST(NVL(m.max_cost, a.max_cost), NVL(a.max_cost, m.max_cost)) max_cost,
p.nl,
p.hj,
p.mj,
LPAD(TRIM(TO_CHAR(ROUND(s.p100_et_us/1e3, 6), '9999,990.000')), 11) p100_et_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p99_et_us/1e3, 6), '9999,990.000')), 11) p99_et_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p97_et_us/1e3, 6), '9999,990.000')), 11) p97_et_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p95_et_us/1e3, 6), '9999,990.000')), 11) p95_et_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p100_cpu_us/1e3, 6), '9999,990.000')), 11) p100_cpu_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p99_cpu_us/1e3, 6), '9999,990.000')), 11) p99_cpu_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p97_cpu_us/1e3, 6), '9999,990.000')), 11) p97_cpu_ms,
LPAD(TRIM(TO_CHAR(ROUND(s.p95_cpu_us/1e3, 6), '9999,990.000')), 11) p95_cpu_ms
FROM p, m, a, phv_stats s
WHERE p.plan_hash_value = m.plan_hash_value(+)
AND p.plan_hash_value = a.plan_hash_value(+)
AND p.plan_hash_value = s.plan_hash_value(+)
ORDER BY
NVL(a.avg_et_us, m.avg_et_us), m.avg_et_us;
PRO
PRO GV$SQLSTATS (it shows only one row for SQL, with most recent info)
PRO ~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT inst_id
, plan_hash_value
, LPAD(TO_CHAR(parse_calls, '999,999,999,999,990'), 20) parse_calls_ff
, LPAD(TO_CHAR(executions, '999,999,999,999,990'), 20) executions_ff
, LPAD(TO_CHAR(px_servers_executions, '999,999,999,999,990'), 20) px_servers_executions_ff
, LPAD(TO_CHAR(fetches, '999,999,999,999,990'), 20) fetches_ff
, LPAD(TO_CHAR(rows_processed, '999,999,999,999,990'), 20) rows_processed_ff
, LPAD(TO_CHAR(version_count, '999,990'), 8) version_count_ff
, LPAD(TO_CHAR(loads, '999,990'), 8) loads_ff
, LPAD(TO_CHAR(invalidations, '999,990'), 8) invalidations_ff
, LPAD(TO_CHAR(buffer_gets, '999,999,999,999,990'), 20) buffer_gets_ff
, LPAD(TO_CHAR(disk_reads, '999,999,999,999,990'), 20) disk_reads_ff
, LPAD(TO_CHAR(direct_writes, '999,999,999,999,990'), 20) direct_writes_ff
, LPAD(TO_CHAR(ROUND(elapsed_time/1e6, 3), '999,999,990.000'), 18) elsapsed_secs_ff
, LPAD(TO_CHAR(ROUND(cpu_time/1e6, 3), '999,999,990.000'), 18) cpu_secs_ff
, LPAD(TO_CHAR(ROUND(user_io_wait_time/1e6, 3), '999,999,990.000'), 18) user_io_wait_secs_ff
, LPAD(TO_CHAR(ROUND(cluster_wait_time/1e6, 3), '999,999,990.000'), 18) cluster_wait_secs_ff
, LPAD(TO_CHAR(ROUND(application_wait_time/1e6, 3), '999,999,990.000'), 18) appl_wait_secs_ff
, LPAD(TO_CHAR(ROUND(concurrency_wait_time/1e6, 3), '999,999,990.000'), 18) conc_wait_secs_ff
, LPAD(TO_CHAR(ROUND(plsql_exec_time/1e6, 3), '999,999,990.000'), 18) plsql_exec_secs_ff
, LPAD(TO_CHAR(ROUND(java_exec_time/1e6, 3), '999,999,990.000'), 18) java_exec_secs_ff
, LPAD(TO_CHAR(sorts, '999,999,999,999,990'), 20) sorts_ff
, LPAD(TO_CHAR(sharable_mem, '999,999,999,999,990'), 20) sharable_mem_ff
, LPAD(TO_CHAR(total_sharable_mem, '999,999,999,999,990'), 20) total_sharable_mem_ff
, LPAD(TO_CHAR(last_active_time, 'YYYY-MM-DD"T"HH24:MI:SS'), 20) last_active_time_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_offload_eligible_bytes, '999,999,999,999,999,999,990'), 30) io_cell_offload_eligible_b_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_interconnect_bytes, '999,999,999,999,999,999,990'), 30) io_interconnect_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_uncompressed_bytes, '999,999,999,999,999,999,990'), 30) io_cell_uncompressed_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_offload_returned_bytes, '999,999,999,999,999,999,990'), 30) io_cell_offload_returned_b_ff
&&is_10g.&&is_11r1., LPAD(CASE WHEN io_cell_offload_eligible_bytes > io_cell_offload_returned_bytes AND io_cell_offload_eligible_bytes > 0 THEN LPAD(TO_CHAR(ROUND((io_cell_offload_eligible_bytes - io_cell_offload_returned_bytes) * 100 / io_cell_offload_eligible_bytes, 2), '990.00')||' %', 9) END, 10) io_saved_ff
FROM gv$sqlstats
WHERE sql_id = :sql_id
ORDER BY inst_id
/
BREAK ON inst_id SKIP PAGE ON obj_sta SKIP PAGE ON obsl SKIP PAGE ON shar SKIP PAGE;
PRO
PRO GV$SQL (ordered by inst_id, object_status, is_obsolete, is_shareable, last_active_time and child_number)
PRO ~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT inst_id
, SUBSTR(object_status, 1, 7) obj_sta
, is_obsolete obsl
, is_shareable shar
, LPAD(TO_CHAR(last_active_time, 'YYYY-MM-DD"T"HH24:MI:SS'), 20) last_active_time_ff
, child_number
, plan_hash_value
, LPAD(TO_CHAR(parse_calls, '999,999,999,999,990'), 20) parse_calls_ff
, LPAD(TO_CHAR(executions, '999,999,999,999,990'), 20) executions_ff
, LPAD(TO_CHAR(px_servers_executions, '999,999,999,999,990'), 20) px_servers_executions_ff
, LPAD(TO_CHAR(fetches, '999,999,999,999,990'), 20) fetches_ff
, LPAD(TO_CHAR(rows_processed, '999,999,999,999,990'), 20) rows_processed_ff
, LPAD(TO_CHAR(loaded_versions, '999,999,990'), 15) loaded_versions_ff
, LPAD(TO_CHAR(open_versions, '999,999,990'), 15) open_versions_ff
, LPAD(TO_CHAR(users_opening, '999,999,990'), 15) users_opening_ff
, LPAD(TO_CHAR(users_executing, '999,999,990'), 15) users_executing_ff
, LPAD(TO_CHAR(loads, '999,990'), 8) loads_ff
, LPAD(TO_CHAR(invalidations, '999,990'), 8) invalidations_ff
, LPAD(TO_CHAR(buffer_gets, '999,999,999,999,990'), 20) buffer_gets_ff
, LPAD(TO_CHAR(disk_reads, '999,999,999,999,990'), 20) disk_reads_ff
, LPAD(TO_CHAR(direct_writes, '999,999,999,999,990'), 20) direct_writes_ff
, LPAD(TO_CHAR(ROUND(elapsed_time/1e6, 3), '999,999,990.000'), 18) elsapsed_secs_ff
, LPAD(TO_CHAR(ROUND(cpu_time/1e6, 3), '999,999,990.000'), 18) cpu_secs_ff
, LPAD(TO_CHAR(ROUND(user_io_wait_time/1e6, 3), '999,999,990.000'), 18) user_io_wait_secs_ff
, LPAD(TO_CHAR(ROUND(cluster_wait_time/1e6, 3), '999,999,990.000'), 18) cluster_wait_secs_ff
, LPAD(TO_CHAR(ROUND(application_wait_time/1e6, 3), '999,999,990.000'), 18) appl_wait_secs_ff
, LPAD(TO_CHAR(ROUND(concurrency_wait_time/1e6, 3), '999,999,990.000'), 18) conc_wait_secs_ff
, LPAD(TO_CHAR(ROUND(plsql_exec_time/1e6, 3), '999,999,990.000'), 18) plsql_exec_secs_ff
, LPAD(TO_CHAR(ROUND(java_exec_time/1e6, 3), '999,999,990.000'), 18) java_exec_secs_ff
, LPAD(TO_CHAR(sorts, '999,999,999,999,990'), 20) sorts_ff
, LPAD(TO_CHAR(sharable_mem, '999,999,999,999,990'), 20) sharable_mem_ff
, LPAD(TO_CHAR(persistent_mem, '999,999,999,999,990'), 20) persistent_mem_ff
, LPAD(TO_CHAR(runtime_mem, '999,999,999,999,990'), 20) runtime_mem_ff
, LPAD(first_load_time, 20) first_load_time_ff
, LPAD(last_load_time, 20) last_load_time_ff
, optimizer_cost
, optimizer_env_hash_value
, parsing_schema_name
, service service_ff
, module module_ff
, action action_ff
, sql_profile sql_profile_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_offload_eligible_bytes, '999,999,999,999,999,999,990'), 30) io_cell_offload_eligible_b_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_interconnect_bytes, '999,999,999,999,999,999,990'), 30) io_interconnect_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_uncompressed_bytes, '999,999,999,999,999,999,990'), 30) io_cell_uncompressed_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(io_cell_offload_returned_bytes, '999,999,999,999,999,999,990'), 30) io_cell_offload_returned_b_ff
&&is_10g.&&is_11r1., LPAD(CASE WHEN io_cell_offload_eligible_bytes > io_cell_offload_returned_bytes AND io_cell_offload_eligible_bytes > 0 THEN LPAD(TO_CHAR(ROUND((io_cell_offload_eligible_bytes - io_cell_offload_returned_bytes) * 100 / io_cell_offload_eligible_bytes, 2), '990.00')||' %', 9) END, 10) io_saved_ff
FROM gv$sql
WHERE sql_id = :sql_id
ORDER BY inst_id
, SUBSTR(object_status, 1, 7) DESC
, is_obsolete
, is_shareable DESC
, last_active_time DESC
, child_number DESC
/
CLEAR BREAKS;
PRO
PRO GV$SQL (grouped by PHV and ordered by et_secs_per_exec)
PRO ~~~~~~
SELECT plan_hash_value
, TO_CHAR(ROUND(SUM(elapsed_time)/SUM(executions)/1e6,6), '999,990.000000') et_secs_per_exec
, TO_CHAR(ROUND(SUM(cpu_time)/SUM(executions)/1e6,6), '999,990.000000') cpu_secs_per_exec
, SUM(executions) executions
--, TO_CHAR(ROUND(SUM(elapsed_time)/1e6,6), '999,999,999,990') et_secs_tot
--, TO_CHAR(ROUND(SUM(cpu_time)/1e6,6), '999,999,999,990') cpu_secs_tot
, COUNT(DISTINCT child_number) cursors
, MAX(child_number) max_child
, SUM(CASE is_bind_sensitive WHEN 'Y' THEN 1 ELSE 0 END) bind_send
, SUM(CASE is_bind_aware WHEN 'Y' THEN 1 ELSE 0 END) bind_aware
, SUM(CASE is_shareable WHEN 'Y' THEN 1 ELSE 0 END) shareable
, SUM(CASE object_status WHEN 'VALID' THEN 1 ELSE 0 END) valid
, SUM(CASE object_status WHEN 'INVALID_UNAUTH' THEN 1 ELSE 0 END) invalid
, TO_CHAR(MAX(last_active_time), 'YYYY-MM-DD"T"HH24:MI:SS') last_active_time
, ROUND(SUM(buffer_gets)/SUM(executions)) buffers_per_exec
, TO_CHAR(ROUND(SUM(rows_processed)/SUM(executions), 3), '999,999,999,990.000') rows_per_exec
FROM gv$sql
WHERE sql_id = :sql_id
AND executions > 0
GROUP BY
plan_hash_value
ORDER BY
2
/
BREAK ON inst_id SKIP PAGE ON obj_sta SKIP PAGE ON obsl SKIP PAGE ON shar SKIP PAGE;
PRO
PRO GV$SQL (ordered by inst_id, object_status, is_obsolete, is_shareable, last_active_time and child_number)
PRO ~~~~~~
SELECT inst_id
, SUBSTR(object_status, 1, 7) obj_sta
, is_obsolete obsl
, is_shareable shar
, LPAD(TO_CHAR(last_active_time, 'YYYY-MM-DD"T"HH24:MI:SS'), 20) last_active_time_ff
, child_number
, plan_hash_value
, is_bind_sensitive sens
, is_bind_aware aware
, users_executing u_exec
, TO_CHAR(ROUND(elapsed_time/executions/1e6,6), '999,990.000000') et_secs_per_exec
, TO_CHAR(ROUND(cpu_time/executions/1e6,6), '999,990.000000') cpu_secs_per_exec
, executions
, TO_CHAR(ROUND(elapsed_time/1e6,6), '999,999,999,990') et_secs_tot
, TO_CHAR(ROUND(cpu_time/1e6,6), '999,999,999,990') cpu_secs_tot
, TO_CHAR(last_active_time, 'YYYY-MM-DD"T"HH24:MI:SS') last_active_time
, ROUND(buffer_gets/executions) buffers_per_exec
, TO_CHAR(ROUND(rows_processed/executions, 3), '999,999,999,990.000') rows_per_exec
FROM gv$sql
WHERE sql_id = :sql_id
AND executions > 0
ORDER BY inst_id
, SUBSTR(object_status, 1, 7) DESC
, is_obsolete
, is_shareable DESC
, last_active_time DESC
, child_number DESC
/
CLEAR BREAKS;
BREAK ON inst_id SKIP PAGE ON obj_sta SKIP PAGE ON obsl SKIP PAGE ON shar SKIP PAGE;
PRO
PRO GV$SQL (ordered by inst_id, object_status, is_obsolete, is_shareable, last_active_time and child_number)
PRO ~~~~~~
SELECT inst_id
, SUBSTR(object_status, 1, 7) obj_sta
, is_obsolete obsl
, is_shareable shar
, LPAD(TO_CHAR(last_active_time, 'YYYY-MM-DD"T"HH24:MI:SS'), 20) last_active_time_ff
, child_number
, plan_hash_value
&&is_10g., sql_plan_baseline
, sql_profile
&&is_10g., sql_patch
FROM gv$sql
WHERE sql_id = :sql_id
AND executions > 0
ORDER BY inst_id
, SUBSTR(object_status, 1, 7) DESC
, is_obsolete
, is_shareable DESC
, last_active_time DESC
, child_number DESC
/
CLEAR BREAKS;
PRO
--PRO GV$SQL_PLAN_STATISTICS_ALL LAST (ordered by inst_id and child_number)
PRO GV$SQL_PLAN_STATISTICS_ALL LAST (ordered by child_number)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRO
--BREAK ON inst_child_ff SKIP 2;
SET PAGES 0;
SPO planx_&&sql_id._&&current_time..txt APP;
/*
WITH v AS (
SELECT /*+ MATERIALIZE * /
DISTINCT sql_id, inst_id, child_number
FROM gv$sql
WHERE sql_id = :sql_id
AND loaded_versions > 0
ORDER BY 1, 2, 3 )
SELECT /*+ ORDERED USE_NL(t) * /
RPAD('Inst: '||v.inst_id, 9)||' '||RPAD('Child: '||v.child_number, 11) inst_child_ff,
t.plan_table_output
FROM v, TABLE(DBMS_XPLAN.DISPLAY('gv$sql_plan_statistics_all', NULL, 'ADVANCED ALLSTATS LAST',
'inst_id = '||v.inst_id||' AND sql_id = '''||v.sql_id||''' AND child_number = '||v.child_number)) t
/
*/
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(:sql_id, NULL, 'ADVANCED ALLSTATS LAST'));
PRO
PRO DBA_HIST_SQLSTAT DELTA (ordered by snap_id DESC, instance_number and plan_hash_value)
PRO ~~~~~~~~~~~~~~~~~~~~~~
SET PAGES 50;
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT s.snap_id
, TO_CHAR(s.begin_interval_time, 'YYYY-MM-DD"T"HH24:MI:SS') begin_interval_time_ff
, TO_CHAR(s.end_interval_time, 'YYYY-MM-DD"T"HH24:MI:SS') end_interval_time_ff
, s.instance_number
, h.plan_hash_value
, DECODE(h.loaded_versions, 1, 'Y', 'N') loaded_ff
, LPAD(TO_CHAR(h.version_count, '999,990'), 8) version_count_ff
, LPAD(TO_CHAR(h.parse_calls_delta, '999,999,999,999,990'), 20) parse_calls_ff
, LPAD(TO_CHAR(h.executions_delta, '999,999,999,999,990'), 20) executions_ff
, LPAD(TO_CHAR(h.rows_processed_delta, '999,999,999,999,990'), 20) rows_processed_ff
, LPAD(TO_CHAR(h.loads_delta, '999,990'), 8) loads_ff
, LPAD(TO_CHAR(h.invalidations_delta, '999,990'), 8) invalidations_ff
, LPAD(TO_CHAR(h.buffer_gets_delta, '999,999,999,999,990'), 20) buffer_gets_ff
, LPAD(TO_CHAR(h.disk_reads_delta, '999,999,999,999,990'), 20) disk_reads_ff
, LPAD(TO_CHAR(h.direct_writes_delta, '999,999,999,999,990'), 20) direct_writes_ff
, LPAD(TO_CHAR(ROUND(h.elapsed_time_delta/1e6, 3), '999,999,990.000'), 18) elsapsed_secs_ff
, LPAD(TO_CHAR(ROUND(h.cpu_time_delta/1e6, 3), '999,999,990.000'), 18) cpu_secs_ff
, LPAD(TO_CHAR(ROUND(h.iowait_delta/1e6, 3), '999,999,990.000'), 18) user_io_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.clwait_delta/1e6, 3), '999,999,990.000'), 18) cluster_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.apwait_delta/1e6, 3), '999,999,990.000'), 18) appl_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.ccwait_delta/1e6, 3), '999,999,990.000'), 18) conc_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.plsexec_time_delta/1e6, 3), '999,999,990.000'), 18) plsql_exec_secs_ff
, LPAD(TO_CHAR(ROUND(h.javexec_time_delta/1e6, 3), '999,999,990.000'), 18) java_exec_secs_ff
, LPAD(TO_CHAR(h.sorts_delta, '999,999,999,999,990'), 20) sorts_ff
, LPAD(TO_CHAR(h.sharable_mem, '999,999,999,999,990'), 20) sharable_mem_ff
, h.optimizer_cost
, h.optimizer_env_hash_value
, h.parsing_schema_name
, h.module module_ff
, h.action action_ff
, h.sql_profile sql_profile_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_offload_elig_bytes_delta, '999,999,999,999,999,999,990'), 30) io_cell_offload_eligible_b_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_interconnect_bytes_delta, '999,999,999,999,999,999,990'), 30) io_interconnect_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.cell_uncompressed_bytes_delta, '999,999,999,999,999,999,990'), 30) io_cell_uncompressed_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_offload_return_bytes_delta, '999,999,999,999,999,999,990'), 30) io_cell_offload_returned_b_ff
&&is_10g.&&is_11r1., LPAD(CASE WHEN h.io_offload_elig_bytes_delta > h.io_offload_return_bytes_delta AND h.io_offload_elig_bytes_delta > 0 THEN LPAD(TO_CHAR(ROUND((h.io_offload_elig_bytes_delta - h.io_offload_return_bytes_delta) * 100 / h.io_offload_elig_bytes_delta, 2), '990.00')||' %', 9) END, 10) io_saved_ff
FROM dba_hist_sqlstat h,
dba_hist_snapshot s
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND s.snap_id = h.snap_id
AND s.dbid = h.dbid
AND s.instance_number = h.instance_number
ORDER BY 1 DESC, 4, 5
/
PRO
PRO DBA_HIST_SQLSTAT TOTAL (ordered by snap_id DESC, instance_number and plan_hash_value)
PRO ~~~~~~~~~~~~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT s.snap_id
, TO_CHAR(s.begin_interval_time, 'YYYY-MM-DD"T"HH24:MI:SS') begin_interval_time_ff
, TO_CHAR(s.end_interval_time, 'YYYY-MM-DD"T"HH24:MI:SS') end_interval_time_ff
, s.instance_number
, h.plan_hash_value
, DECODE(h.loaded_versions, 1, 'Y', 'N') loaded_ff
, LPAD(TO_CHAR(h.version_count, '999,990'), 8) version_count_ff
, LPAD(TO_CHAR(h.parse_calls_total, '999,999,999,999,990'), 20) parse_calls_ff
, LPAD(TO_CHAR(h.executions_total, '999,999,999,999,990'), 20) executions_ff
, LPAD(TO_CHAR(h.rows_processed_total, '999,999,999,999,990'), 20) rows_processed_ff
, LPAD(TO_CHAR(h.loads_total, '999,990'), 8) loads_ff
, LPAD(TO_CHAR(h.invalidations_total, '999,990'), 8) invalidations_ff
, LPAD(TO_CHAR(h.buffer_gets_total, '999,999,999,999,990'), 20) buffer_gets_ff
, LPAD(TO_CHAR(h.disk_reads_total, '999,999,999,999,990'), 20) disk_reads_ff
, LPAD(TO_CHAR(h.direct_writes_total, '999,999,999,999,990'), 20) direct_writes_ff
, LPAD(TO_CHAR(ROUND(h.elapsed_time_total/1e6, 3), '999,999,990.000'), 18) elsapsed_secs_ff
, LPAD(TO_CHAR(ROUND(h.cpu_time_total/1e6, 3), '999,999,990.000'), 18) cpu_secs_ff
, LPAD(TO_CHAR(ROUND(h.iowait_total/1e6, 3), '999,999,990.000'), 18) user_io_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.clwait_total/1e6, 3), '999,999,990.000'), 18) cluster_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.apwait_total/1e6, 3), '999,999,990.000'), 18) appl_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.ccwait_total/1e6, 3), '999,999,990.000'), 18) conc_wait_secs_ff
, LPAD(TO_CHAR(ROUND(h.plsexec_time_total/1e6, 3), '999,999,990.000'), 18) plsql_exec_secs_ff
, LPAD(TO_CHAR(ROUND(h.javexec_time_total/1e6, 3), '999,999,990.000'), 18) java_exec_secs_ff
, LPAD(TO_CHAR(h.sorts_total, '999,999,999,999,990'), 20) sorts_ff
, LPAD(TO_CHAR(h.sharable_mem, '999,999,999,999,990'), 20) sharable_mem_ff
, h.optimizer_cost
, h.optimizer_env_hash_value
, h.parsing_schema_name
, h.module module_ff
, h.action action_ff
, h.sql_profile sql_profile_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_offload_elig_bytes_total, '999,999,999,999,999,999,990'), 30) io_cell_offload_eligible_b_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_interconnect_bytes_total, '999,999,999,999,999,999,990'), 30) io_interconnect_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.cell_uncompressed_bytes_total, '999,999,999,999,999,999,990'), 30) io_cell_uncompressed_bytes_ff
&&is_10g.&&is_11r1., LPAD(TO_CHAR(h.io_offload_return_bytes_total, '999,999,999,999,999,999,990'), 30) io_cell_offload_returned_b_ff
&&is_10g.&&is_11r1., LPAD(CASE WHEN h.io_offload_elig_bytes_total > h.io_offload_return_bytes_total AND h.io_offload_elig_bytes_total > 0 THEN LPAD(TO_CHAR(ROUND((h.io_offload_elig_bytes_total - h.io_offload_return_bytes_total) * 100 / h.io_offload_elig_bytes_total, 2), '990.00')||' %', 9) END, 10) io_saved_ff
FROM dba_hist_sqlstat h,
dba_hist_snapshot s
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND s.snap_id = h.snap_id
AND s.dbid = h.dbid
AND s.instance_number = h.instance_number
ORDER BY 1 DESC, 4, 5
/
PRO
PRO DBA_HIST_SQLSTAT DELTA (ordered by et_secs_per_exec)
PRO ~~~~~~~~~~~~~~~~~~~~~~
SELECT plan_hash_value
, TO_CHAR(ROUND(SUM(elapsed_time_delta)/SUM(executions_delta)/1e6,6), '999,990.000000') et_secs_per_exec
, TO_CHAR(ROUND(SUM(cpu_time_delta)/SUM(executions_delta)/1e6,6), '999,990.000000') cpu_secs_per_exec
, SUM(executions_delta) executions
, TO_CHAR(ROUND(SUM(elapsed_time_delta)/1e6,6), '999,999,999,990') et_secs_tot
, TO_CHAR(ROUND(SUM(cpu_time_delta)/1e6,6), '999,999,999,990') cpu_secs_tot
, ROUND(SUM(buffer_gets_delta)/SUM(executions_delta)) buffers_per_exec
, TO_CHAR(ROUND(SUM(rows_processed_delta)/SUM(executions_delta), 3), '999,999,999,990.000') rows_per_exec
FROM dba_hist_sqlstat
WHERE :license = 'Y'
AND sql_id = :sql_id
AND executions_delta > 0
GROUP BY
plan_hash_value
ORDER BY
2
/
PRO
PRO DBA_HIST_SQL_PLAN (ordered by plan_hash_value)
PRO ~~~~~~~~~~~~~~~~~
BREAK ON plan_timestamp_ff SKIP 2;
SET PAGES 0;
SPO planx_&&sql_id._&&current_time..txt APP;
WITH v AS (
SELECT /*+ MATERIALIZE */
DISTINCT sql_id, plan_hash_value, dbid, timestamp
FROM dba_hist_sql_plan
WHERE :license = 'Y'
AND dbid = :dbid
AND sql_id = :sql_id
ORDER BY 1, 2, 3 )
SELECT /*+ ORDERED USE_NL(t) */
TO_CHAR(v.timestamp, 'YYYY-MM-DD"T"HH24:MI:SS') plan_timestamp_ff,
t.plan_table_output
FROM v, TABLE(DBMS_XPLAN.DISPLAY_AWR(v.sql_id, v.plan_hash_value, v.dbid, 'ADVANCED')) t
/
CLEAR BREAK;
PRO
PRO GV$ACTIVE_SESSION_HISTORY
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_slices = '10';
SET PAGES 50;
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+ MATERIALIZE */
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM gv$active_session_history h
WHERE :license = 'Y'
AND sql_id = :sql_id
GROUP BY
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
2 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 7 days by timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '7';
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.ash)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
USE_HASH(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn h.INT$DBA_HIST_ACT_SESS_HISTORY.ash h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
FULL(h.sn)
FULL(h.ash)
FULL(h.evt)
USE_HASH(h.sn h.ash h.evt)
*/
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM dba_hist_active_sess_history h
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND h.snap_id BETWEEN &&x_minimum_snap_id. AND &&x_maximum_snap_id.
GROUP BY
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
2 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO AWR History range considered: from &&x_minimum_date. to &&x_maximum_date.
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 31 days by timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '31';
SPO planx_&&sql_id._&&current_time..txt APP;
/
PRO
PRO GV$ACTIVE_SESSION_HISTORY
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_slices = '15';
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+ MATERIALIZE */
h.sql_plan_hash_value plan_hash_value,
NVL(h.sql_plan_line_id, 0) line_id_ff,
SUBSTR(h.sql_plan_operation||' '||h.sql_plan_options, 1, 50) operation_ff,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM gv$active_session_history h
WHERE :license = 'Y'
AND sql_id = :sql_id
GROUP BY
h.sql_plan_hash_value,
h.sql_plan_line_id,
h.sql_plan_operation,
h.sql_plan_options,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
5 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.plan_hash_value,
e.line_id_ff,
e.operation_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
TO_NUMBER(NULL) plan_hash_value,
TO_NUMBER(NULL) id,
NULL operation_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 7 days by plan line and timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '7';
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.ash)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
USE_HASH(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn h.INT$DBA_HIST_ACT_SESS_HISTORY.ash h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
FULL(h.sn)
FULL(h.ash)
FULL(h.evt)
USE_HASH(h.sn h.ash h.evt)
*/
h.sql_plan_hash_value plan_hash_value,
NVL(h.sql_plan_line_id, 0) line_id_ff,
SUBSTR(h.sql_plan_operation||' '||h.sql_plan_options, 1, 50) operation_ff,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM dba_hist_active_sess_history h
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND h.snap_id BETWEEN &&x_minimum_snap_id. AND &&x_maximum_snap_id.
GROUP BY
h.sql_plan_hash_value,
h.sql_plan_line_id,
h.sql_plan_operation,
h.sql_plan_options,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
5 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.plan_hash_value,
e.line_id_ff,
e.operation_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
TO_NUMBER(NULL) plan_hash_value,
TO_NUMBER(NULL) id,
NULL operation_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO AWR History range considered: from &&x_minimum_date. to &&x_maximum_date.
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 31 days by plan line and timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '31';
SPO planx_&&sql_id._&&current_time..txt APP;
/
PRO
PRO GV$ACTIVE_SESSION_HISTORY
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_slices = '20';
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+ MATERIALIZE */
h.sql_plan_hash_value plan_hash_value,
NVL(h.sql_plan_line_id, 0) line_id_ff,
SUBSTR(h.sql_plan_operation||' '||h.sql_plan_options, 1, 50) operation_ff,
CASE h.session_state WHEN 'ON CPU' THEN -1 ELSE h.current_obj# END current_obj#,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM gv$active_session_history h
WHERE :license = 'Y'
AND sql_id = :sql_id
GROUP BY
h.sql_plan_hash_value,
h.sql_plan_line_id,
h.sql_plan_operation,
h.sql_plan_options,
CASE h.session_state WHEN 'ON CPU' THEN -1 ELSE h.current_obj# END,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
6 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.plan_hash_value,
e.line_id_ff,
e.operation_ff,
SUBSTR(e.current_obj#||' '||TRIM(
(SELECT CASE e.current_obj# WHEN 0 THEN ' UNDO' ELSE ' '||o.owner||'.'||o.object_name||' ('||o.object_type||')' END
FROM dba_objects o WHERE o.object_id(+) = e.current_obj# AND ROWNUM = 1)
), 1, 60) current_object_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
TO_NUMBER(NULL) plan_hash_value,
TO_NUMBER(NULL) id,
NULL operation_ff,
NULL current_object_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 7 days by plan line, obj and timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '7';
SPO planx_&&sql_id._&&current_time..txt APP;
WITH
events AS (
SELECT /*+
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.ash)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
USE_HASH(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn h.INT$DBA_HIST_ACT_SESS_HISTORY.ash h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
FULL(h.sn)
FULL(h.ash)
FULL(h.evt)
USE_HASH(h.sn h.ash h.evt)
*/
h.sql_plan_hash_value plan_hash_value,
NVL(h.sql_plan_line_id, 0) line_id_ff,
SUBSTR(h.sql_plan_operation||' '||h.sql_plan_options, 1, 50) operation_ff,
CASE h.session_state WHEN 'ON CPU' THEN -1 ELSE h.current_obj# END current_obj#,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END timed_event,
COUNT(*) samples
FROM dba_hist_active_sess_history h
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND h.snap_id BETWEEN &&x_minimum_snap_id. AND &&x_maximum_snap_id.
GROUP BY
h.sql_plan_hash_value,
h.sql_plan_line_id,
h.sql_plan_operation,
h.sql_plan_options,
CASE h.session_state WHEN 'ON CPU' THEN -1 ELSE h.current_obj# END,
CASE h.session_state WHEN 'ON CPU' THEN h.session_state ELSE h.wait_class||' "'||h.event||'"' END
ORDER BY
6 DESC
),
total AS (
SELECT SUM(samples) samples,
SUM(CASE WHEN ROWNUM > &&x_slices. THEN samples ELSE 0 END) others
FROM events
)
SELECT e.samples samples_ff,
ROUND(100 * e.samples / t.samples, 1) percent_ff,
e.plan_hash_value,
e.line_id_ff,
e.operation_ff,
SUBSTR(e.current_obj#||' '||TRIM(
(SELECT CASE e.current_obj# WHEN 0 THEN ' UNDO' ELSE ' '||o.owner||'.'||o.object_name||' ('||o.object_type||')' END
FROM dba_objects o WHERE o.object_id(+) = e.current_obj# AND ROWNUM = 1)
), 1, 60) current_object_ff,
e.timed_event timed_event_ff
FROM events e,
total t
WHERE ROWNUM <= &&x_slices.
AND ROUND(100 * e.samples / t.samples, 1) > 0.1
UNION ALL
SELECT others samples_ff,
ROUND(100 * others / samples, 1) percent_ff,
TO_NUMBER(NULL) plan_hash_value,
TO_NUMBER(NULL) id,
NULL operation_ff,
NULL current_object_ff,
'Others' timed_event_ff
FROM total
WHERE others > 0
AND ROUND(100 * others / samples, 1) > 0.1
/
PRO
PRO AWR History range considered: from &&x_minimum_date. to &&x_maximum_date.
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRO
PRO DBA_HIST_ACTIVE_SESS_HISTORY (past 31 days by plan line, obj and timed event)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEF x_days = '31';
SPO planx_&&sql_id._&&current_time..txt APP;
/
PRO
PRO SQL Plan Baselines
PRO ~~~~~~~~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT created, plan_name, origin, enabled, accepted, fixed, reproduced, &&is_10g.&&is_11r1.adaptive,
last_executed, last_modified, description
FROM dba_sql_plan_baselines WHERE signature = :signature
ORDER BY created, plan_name
/
SET HEA OFF PAGES 0;
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE('&&sql_handle.'))
/
SET HEA ON PAGES 50;
SPO planx_&&sql_id._&&current_time..txt APP;
PRO get list of tables from execution plan
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VAR tables_list CLOB;
EXEC :tables_list := NULL;
-- get list of tables from execution plan
-- format (('owner', 'table_name'), (), ()...)
DECLARE
l_pair VARCHAR2(32767);
BEGIN
DBMS_LOB.CREATETEMPORARY(:tables_list, TRUE, DBMS_LOB.SESSION);
FOR i IN (WITH object AS (
SELECT /*+ MATERIALIZE */
object_owner owner, object_name name
FROM gv$sql_plan
WHERE inst_id IN (SELECT inst_id FROM gv$instance)
AND sql_id = :sql_id
AND object_owner IS NOT NULL
AND object_name IS NOT NULL
UNION
SELECT object_owner owner, object_name name
FROM dba_hist_sql_plan
WHERE :license = 'Y'
AND dbid = :dbid
AND sql_id = :sql_id
AND object_owner IS NOT NULL
AND object_name IS NOT NULL
UNION
SELECT CASE h.current_obj# WHEN 0 THEN 'SYS' ELSE o.owner END owner,
CASE h.current_obj# WHEN 0 THEN 'UNDO' ELSE o.object_name END name
FROM gv$active_session_history h,
dba_objects o
WHERE :license = 'Y'
AND h.sql_id = :sql_id
AND h.current_obj# >= 0
AND o.object_id(+) = h.current_obj#
UNION
SELECT /*+
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.ash)
FULL(h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
USE_HASH(h.INT$DBA_HIST_ACT_SESS_HISTORY.sn h.INT$DBA_HIST_ACT_SESS_HISTORY.ash h.INT$DBA_HIST_ACT_SESS_HISTORY.evt)
FULL(h.sn)
FULL(h.ash)
FULL(h.evt)
USE_HASH(h.sn h.ash h.evt)
*/
CASE h.current_obj# WHEN 0 THEN 'SYS' ELSE o.owner END owner,
CASE h.current_obj# WHEN 0 THEN 'UNDO' ELSE o.object_name END name
FROM dba_hist_active_sess_history h,
dba_objects o
WHERE :license = 'Y'
AND h.dbid = :dbid
AND h.sql_id = :sql_id
AND h.current_obj# >= 0
AND o.object_id(+) = h.current_obj#
)
SELECT 'TABLE', t.owner, t.table_name
FROM dba_tab_statistics t, -- include fixed objects
object o
WHERE t.owner = o.owner
AND t.table_name = o.name
UNION
SELECT 'TABLE', i.table_owner, i.table_name
FROM dba_indexes i,
object o
WHERE i.owner = o.owner
AND i.index_name = o.name)
LOOP
IF l_pair IS NULL THEN
DBMS_LOB.WRITEAPPEND(:tables_list, 1, '(');
ELSE
IF DBMS_LOB.GETLENGTH(:tables_list) < 2799 THEN
DBMS_LOB.WRITEAPPEND(:tables_list, 1, ',');
END IF;
END IF;
l_pair := '('''||i.owner||''','''||i.table_name||''')';
-- SP2-0341: line overflow during variable substitution (>3000 characters at line 12)
IF DBMS_LOB.GETLENGTH(:tables_list) < 2800 THEN
DBMS_LOB.WRITEAPPEND(:tables_list, LENGTH(l_pair), l_pair);
ELSE
EXIT;
END IF;
END LOOP;
IF l_pair IS NULL THEN
l_pair := '((''DUMMY'',''DUMMY''))';
DBMS_LOB.WRITEAPPEND(:tables_list, LENGTH(l_pair), l_pair);
ELSE
DBMS_LOB.WRITEAPPEND(:tables_list, 1, ')');
END IF;
END;
/
SET LONG 2000000 LONGC 2000 LIN 32767;
COL tables_list NEW_V tables_list FOR A32767;
SET HEAD OFF;
PRO
PRO (owner, table) list
PRO ~~~~~~~~~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT :tables_list tables_list FROM DUAL
/
SET HEAD ON;
PRO
PRO Tables Accessed
PRO ~~~~~~~~~~~~~~~
COL table_name FOR A50;
COL degree FOR A10;
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT owner||'.'||table_name table_name,
partitioned,
degree,
temporary,
blocks,
num_rows,
avg_row_len,
sample_size,
TO_CHAR(last_analyzed, 'YYYY-MM-DD"T"HH24:MI:SS') last_analyzed,
global_stats,
compression
FROM dba_tables
WHERE (owner, table_name) IN &&tables_list.
ORDER BY
owner,
table_name
/
PRO
PRO Indexes
PRO ~~~~~~~
COL table_and_index_name FOR A70;
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT i.table_owner||'.'||i.table_name||' '||i.owner||'.'||i.index_name table_and_index_name,
i.partitioned,
i.degree,
i.index_type,
i.uniqueness,
(SELECT COUNT(*) FROM dba_ind_columns ic WHERE ic.index_owner = i.owner AND ic.index_name = i.index_name) columns,
i.status,
&&is_10g.i.visibility,
i.blevel,
i.leaf_blocks,
i.distinct_keys,
i.clustering_factor,
i.num_rows,
i.sample_size,
TO_CHAR(i.last_analyzed, 'YYYY-MM-DD"T"HH24:MI:SS') last_analyzed,
i.global_stats
FROM dba_indexes i
WHERE (i.table_owner, i.table_name) IN &&tables_list.
ORDER BY
i.table_owner,
i.table_name,
i.owner,
i.index_name
/
SET LONG 200 LONGC 20;
COL index_and_column_name FOR A70;
COL table_and_column_name FOR A70;
COL data_type FOR A20;
COL data_default FOR A20;
COL low_value FOR A32;
COL high_value FOR A32;
COL low_value_translated FOR A32;
COL high_value_translated FOR A32;
PRO
PRO Index Columns
PRO ~~~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT i.index_owner||'.'||i.index_name||' '||c.column_name index_and_column_name,
c.data_type,
c.nullable,
c.data_default,
c.num_distinct,
CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.low_value))
WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.low_value)),1,32)
WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.low_value)),1,32)
WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.low_value))
WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.low_value))
WHEN c.data_type = 'DATE' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,13,2),'XX')-1,'00')))
WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,13,2),'XX')-1,'00'))||'.'||
to_number(substr(c.low_value,15,8),'XXXXXXXX'))
END low_value_translated,
CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.high_value))
WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.high_value)),1,32)
WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.high_value)),1,32)
WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.high_value))
WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.high_value))
WHEN c.data_type = 'DATE' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,13,2),'XX')-1,'00')))
WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,13,2),'XX')-1,'00'))||'.'||
to_number(substr(c.high_value,15,8),'XXXXXXXX'))
END high_value_translated,
c.density,
c.num_nulls,
c.num_buckets,
c.histogram,
c.sample_size,
TO_CHAR(c.last_analyzed, 'YYYY-MM-DD"T"HH24:MI:SS') last_analyzed,
c.global_stats,
c.avg_col_len
FROM dba_ind_columns i,
dba_tab_cols c
WHERE (i.table_owner, i.table_name) IN &&tables_list.
AND c.owner = i.table_owner
AND c.table_name = i.table_name
AND c.column_name = i.column_name
ORDER BY
i.index_owner,
i.index_name,
i.column_position
/
PRO
PRO Table Columns
PRO ~~~~~~~~~~~~~
SPO planx_&&sql_id._&&current_time..txt APP;
SELECT c.owner||'.'||c.table_name||' '||c.column_name table_and_column_name,
c.data_type,
c.nullable,
c.data_default,
c.num_distinct,
CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.low_value))
WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.low_value)),1,32)
WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.low_value)),1,32)
WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.low_value))
WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.low_value))
WHEN c.data_type = 'DATE' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,13,2),'XX')-1,'00')))
WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.low_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.low_value,13,2),'XX')-1,'00'))||'.'||
to_number(substr(c.low_value,15,8),'XXXXXXXX'))
END low_value_translated,
CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.high_value))
WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.high_value)),1,32)
WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.high_value)),1,32)
WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.high_value))
WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.high_value))
WHEN c.data_type = 'DATE' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,13,2),'XX')-1,'00')))
WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,5,2) ,'XX') ,'00'))||'-'||
ltrim(to_char( to_number(substr(c.high_value,7,2) ,'XX') ,'00'))||'/'||
ltrim(to_char( to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char( to_number(substr(c.high_value,13,2),'XX')-1,'00'))||'.'||
to_number(substr(c.high_value,15,8),'XXXXXXXX'))
END high_value_translated,
c.density,
c.num_nulls,
c.num_buckets,
c.histogram,
c.sample_size,
TO_CHAR(c.last_analyzed, 'YYYY-MM-DD"T"HH24:MI:SS') last_analyzed,
c.global_stats,
c.avg_col_len
FROM dba_tab_cols c
WHERE (c.owner, c.table_name) IN &&tables_list.
ORDER BY
c.owner,
c.table_name,
c.column_name
/
-- spool off and cleanup
PRO
PRO planx_&&sql_id._&&current_time..txt has been generated
SPO OFF;