1410 lines
61 KiB
MySQL
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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_time..txt APP;
|
|
/
|
|
|
|
PRO
|
|
PRO GV$ACTIVE_SESSION_HISTORY
|
|
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
DEF x_slices = '15';
|
|
SPO planx_&&sql_id._&¤t_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._&¤t_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._&¤t_time..txt APP;
|
|
/
|
|
|
|
PRO
|
|
PRO GV$ACTIVE_SESSION_HISTORY
|
|
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
DEF x_slices = '20';
|
|
SPO planx_&&sql_id._&¤t_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._&¤t_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._&¤t_time..txt APP;
|
|
/
|
|
|
|
PRO
|
|
PRO SQL Plan Baselines
|
|
PRO ~~~~~~~~~~~~~~~~~~
|
|
SPO planx_&&sql_id._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_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._&¤t_time..txt has been generated
|
|
SPO OFF;
|
|
|