diff --git a/sqlhc/sqlhc.sql b/sqlhc/sqlhc.sql
new file mode 100644
index 0000000000000000000000000000000000000000..53c1794fb928b02989c49d0553b8fef56cf74884
--- /dev/null
+++ b/sqlhc/sqlhc.sql
@@ -0,0 +1,7346 @@
+SPO sqlhc.log
+SET DEF ^ TERM OFF ECHO ON AUTOP OFF VER OFF SERVEROUT ON SIZE 1000000;
+REM
+REM $Header: 1366133.1 sqlhc.sql 12.1.08 2014/04/18 carlos.sierra mauro.pagano $
+REM
+REM Copyright (c) 2000-2013, Oracle Corporation. All rights reserved.
+REM
+REM AUTHOR
+REM carlos.sierra@oracle.com
+REM mauro.pagano@oracle.com
+REM
+REM SCRIPT
+REM sqlhc.sql SQL Health-Check (extract mode)
+REM
+REM DESCRIPTION
+REM Produces an HTML report with a list of observations based on
+REM health-checks performed in and around a SQL statement that
+REM may be performing poorly.
+REM
+REM Inputs a memory-resident SQL_ID.
+REM
+REM In addition to the health_check report, it generates some
+REM additional diagnostics files regarding SQL performance.
+REM
+REM This script does not install any objects in the database.
+REM It does not perform any DDL commands.
+REM It only performs DML commands against the PLAN_TABLE then it
+REM rolls back those temporary inserts.
+REM It can be used in Dataguard or any read-only database.
+REM
+REM PRE-REQUISITES
+REM 1. Execute as SYS or user with DBA role or user with access
+REM to data dictionary views.
+REM 2. The SQL for which this script is executed must be
+REM memory-resident.
+REM
+REM PARAMETERS
+REM 1. Oracle Pack license (Tuning or Diagnostics or None) T|D|N
+REM 2. SQL_ID of interest.
+REM
+REM EXECUTION
+REM 1. Start SQL*Plus connecting as SYS or user with DBA role or
+REM user with access to data dictionary views.
+REM 2. Execute script sqlhc.sql passing values for parameters.
+REM
+REM EXAMPLE
+REM # sqlplus / as sysdba
+REM SQL> START [path]sqlhc.sql [T|D|N] [SQL_ID]
+REM SQL> START sqlhc.sql T 51x6yr9ym5hdc
+REM
+REM NOTES
+REM 1. For possible errors see sqlhc.log.
+REM 2. If site has both Tuning and Diagnostics licenses then
+REM specified T (Oracle Tuning pack includes Oracle Diagnostics)
+REM 3. On a read-only instance, the "Observations" section with the
+REM results of the health-checks will be missing.
+REM
+DEF health_checks = 'Y';
+DEF shared_cursor = 'N';
+DEF sql_monitor_reports = '12';
+REM
+DEF script = 'sqlhc';
+DEF method = 'SQLHC';
+DEF mos_doc = '1366133.1';
+DEF doc_ver = '12.1.06';
+DEF doc_date = '2014/01/30';
+-- sqldx_output: HTML/CSV/BOTH/NONE
+DEF sqldx_output = 'CSV';
+
+/**************************************************************************************************/
+
+EXEC DBMS_APPLICATION_INFO.SET_MODULE(module_name => '^^method. ^^doc_ver.', action_name => '^^script..sql');
+EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO(client_info => '^^method.');
+VAR health_checks CHAR(1);
+EXEC :health_checks := '^^health_checks.';
+VAR shared_cursor CHAR(1);
+EXEC :shared_cursor := '^^shared_cursor.';
+SET TERM ON ECHO OFF;
+PRO
+PRO Parameter 1:
+PRO Oracle Pack License (Tuning, Diagnostics or None) [T|D|N] (required)
+PRO
+DEF input_license = '^1';
+PRO
+SET TERM OFF;
+COL license NEW_V license FOR A1;
+
+SELECT UPPER(SUBSTR(TRIM('^^input_license.'), 1, 1)) license FROM DUAL;
+
+VAR license CHAR(1);
+EXEC :license := '^^license.';
+
+COL unique_id NEW_V unique_id FOR A15;
+SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') unique_id FROM DUAL;
+
+SET TERM ON;
+WHENEVER SQLERROR EXIT SQL.SQLCODE;
+
+BEGIN
+ IF '^^license.' IS NULL OR '^^license.' NOT IN ('T', 'D', 'N') THEN
+ RAISE_APPLICATION_ERROR(-20100, 'Oracle Pack License (Tuning, Diagnostics or None) must be specified as "T" or "D" or "N".');
+ END IF;
+END;
+/
+
+WHENEVER SQLERROR CONTINUE;
+
+PRO
+PRO Parameter 2:
+PRO SQL_ID of the SQL to be analyzed (required)
+PRO
+DEF input_sql_id = '^2';
+DEF input_parameter = '^^input_sql_id.';
+PRO
+
+PRO Values passed:
+PRO License: "^^input_license."
+PRO SQL_ID : "^^input_sql_id."
+PRO
+--SET TERM OFF;
+
+-- get dbid
+COL dbid NEW_V dbid;
+SELECT dbid FROM v$database;
+
+COL sql_id NEW_V sql_id FOR A13;
+
+SELECT sql_id
+ FROM gv$sqlarea
+ WHERE sql_id = TRIM('^^input_sql_id.')
+ UNION
+SELECT sql_id
+ FROM dba_hist_sqltext
+ WHERE :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = TRIM('^^input_sql_id.');
+
+VAR sql_id VARCHAR2(13);
+EXEC :sql_id := '^^sql_id.';
+
+SET TERM ON;
+WHENEVER SQLERROR EXIT SQL.SQLCODE;
+
+BEGIN
+ IF '^^sql_id.' IS NULL THEN
+ IF :license IN ('T', 'D') THEN
+ RAISE_APPLICATION_ERROR(-20200, 'SQL_ID "^^input_sql_id." not found in memory nor in AWR.');
+ ELSE
+ RAISE_APPLICATION_ERROR(-20200, 'SQL_ID "^^input_sql_id." not found in memory.');
+ END IF;
+ END IF;
+END;
+/
+
+WHENEVER SQLERROR CONTINUE;
+SET ECHO ON TIMI ON;
+
+/**************************************************************************************************
+ *
+ * begin_common: from begin_common to end_common sqlhc.sql and sqlhcxec.sql are identical
+ *
+ **************************************************************************************************/
+SELECT 'BEGIN: '||TO_CHAR(SYSDATE, 'YYYY-MM-DD/HH24:MI:SS') FROM dual;
+
+DEF doc_link = 'https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=';
+DEF bug_link = 'https://support.oracle.com/CSP/main/article?cmd=show&type=BUG&id=';
+
+-- tracing script in case it takes long to execute so we can diagnose it
+ALTER SESSION SET MAX_DUMP_FILE_SIZE = '1G';
+ALTER SESSION SET TRACEFILE_IDENTIFIER = "^^script._^^unique_id.";
+--ALTER SESSION SET STATISTICS_LEVEL = 'ALL';
+ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
+
+-- adding to prevent slow access to ASH with non default NLS settings
+ALTER SESSION SET NLS_SORT = 'BINARY';
+ALTER SESSION SET NLS_COMP = 'BINARY';
+
+/**************************************************************************************************/
+
+/* -------------------------
+ *
+ * get sql_text
+ *
+ * ------------------------- */
+
+VAR sql_text CLOB;
+EXEC :sql_text := NULL;
+
+-- get sql_text from memory
+DECLARE
+ l_sql_text VARCHAR2(32767);
+BEGIN -- 10g see bug 5017909
+ DBMS_OUTPUT.PUT_LINE('getting sql_text from memory');
+ FOR i IN (SELECT DISTINCT piece, sql_text
+ FROM gv$sqltext_with_newlines
+ WHERE sql_id = '^^sql_id.'
+ ORDER BY 1, 2)
+ LOOP
+ IF :sql_text IS NULL THEN
+ DBMS_LOB.CREATETEMPORARY(:sql_text, TRUE);
+ DBMS_LOB.OPEN(:sql_text, DBMS_LOB.LOB_READWRITE);
+ END IF;
+ l_sql_text := REPLACE(i.sql_text, CHR(00), ' ');
+ DBMS_LOB.WRITEAPPEND(:sql_text, LENGTH(l_sql_text), l_sql_text);
+ END LOOP;
+ IF :sql_text IS NOT NULL THEN
+ DBMS_LOB.CLOSE(:sql_text);
+ END IF;
+EXCEPTION
+ WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE('getting sql_text from memory: '||SQLERRM);
+ :sql_text := NULL;
+END;
+/
+
+-- get sql_text from awr
+BEGIN
+ IF :license IN ('T', 'D') AND (:sql_text IS NULL OR NVL(DBMS_LOB.GETLENGTH(:sql_text), 0) = 0) THEN
+ DBMS_OUTPUT.PUT_LINE('getting sql_text from awr');
+ SELECT REPLACE(sql_text, CHR(00), ' ')
+ INTO :sql_text
+ FROM dba_hist_sqltext
+ WHERE :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = '^^sql_id.'
+ AND sql_text IS NOT NULL
+ AND ROWNUM = 1;
+ END IF;
+EXCEPTION
+ WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE('getting sql_text from awr: '||SQLERRM);
+ :sql_text := NULL;
+END;
+/
+
+SELECT :sql_text FROM DUAL;
+
+/* -------------------------
+ *
+ * get several values
+ *
+ * ------------------------- */
+
+-- signature (force=false)
+VAR signature NUMBER;
+BEGIN
+ IF :license = 'T' THEN
+ :signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text, FALSE);
+ ELSE
+ :signature := -1;
+ END IF;
+END;
+/
+COL signature NEW_V signature FOR A20;
+SELECT TO_CHAR(:signature) signature FROM DUAL;
+
+-- signature (force=true)
+VAR signaturef NUMBER;
+BEGIN
+ IF :license = 'T' THEN
+ :signaturef := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text, TRUE);
+ ELSE
+ :signaturef := -1;
+ END IF;
+END;
+/
+COL signaturef NEW_V signaturef FOR A20;
+SELECT TO_CHAR(:signaturef) signaturef FROM DUAL;
+
+-- get database name (up to 10, stop before first '.', no special characters)
+COL database_name_short NEW_V database_name_short FOR A10;
+SELECT SUBSTR(SYS_CONTEXT('USERENV', 'DB_NAME'), 1, 10) database_name_short FROM DUAL;
+SELECT SUBSTR('^^database_name_short.', 1, INSTR('^^database_name_short..', '.') - 1) database_name_short FROM DUAL;
+SELECT TRANSLATE('^^database_name_short.',
+'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ''`~!@#$%^*()-_=+[]{}\|;:",.<>/?'||CHR(0)||CHR(9)||CHR(10)||CHR(13)||CHR(38),
+'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') database_name_short FROM DUAL;
+
+-- get host name (up to 30, stop before first '.', no special characters)
+COL host_name_short NEW_V host_name_short FOR A30;
+SELECT SUBSTR(SYS_CONTEXT('USERENV', 'SERVER_HOST'), 1, 30) host_name_short FROM DUAL;
+SELECT SUBSTR('^^host_name_short.', 1, INSTR('^^host_name_short..', '.') - 1) host_name_short FROM DUAL;
+SELECT TRANSLATE('^^host_name_short.',
+'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ''`~!@#$%^*()-_=+[]{}\|;:",.<>/?'||CHR(0)||CHR(9)||CHR(10)||CHR(13)||CHR(38),
+'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') host_name_short FROM DUAL;
+
+-- get rdbms version
+COL rdbms_version NEW_V rdbms_version FOR A17;
+SELECT version rdbms_version FROM v$instance;
+
+-- get platform
+COL platform NEW_V platform FOR A80;
+SELECT UPPER(TRIM(REPLACE(REPLACE(product, 'TNS for '), ':' ))) platform FROM product_component_version WHERE product LIKE 'TNS for%' AND ROWNUM = 1;
+
+-- get instance
+COL instance_number NEW_V instance_number FOR A10;
+SELECT TO_CHAR(instance_number) instance_number FROM v$instance;
+
+-- YYYYMMDD_HH24MISS
+COL time_stamp NEW_V time_stamp FOR A15;
+SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') time_stamp FROM DUAL;
+
+-- YYYY-MM-DD/HH24:MI:SS
+COL time_stamp2 NEW_V time_stamp2 FOR A20;
+SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD/HH24:MI:SS') time_stamp2 FROM DUAL;
+
+-- get db_block_size
+COL sys_db_block_size NEW_V sys_db_block_size FOR A17;
+SELECT value sys_db_block_size FROM v$system_parameter2 WHERE LOWER(name) = 'db_block_size';
+
+-- get cpu_count
+COL sys_cpu NEW_V sys_cpu FOR A17;
+SELECT value sys_cpu FROM v$system_parameter2 WHERE LOWER(name) = 'cpu_count';
+
+-- get ofe
+COL sys_ofe NEW_V sys_ofe FOR A17;
+SELECT value sys_ofe FROM v$system_parameter2 WHERE LOWER(name) = 'optimizer_features_enable';
+
+-- get ds
+COL sys_ds NEW_V sys_ds FOR A10;
+SELECT value sys_ds FROM v$system_parameter2 WHERE LOWER(name) = 'optimizer_dynamic_sampling';
+
+-- Exadata?
+COL exadata NEW_V exadata FOR A1;
+SELECT 'Y' exadata FROM v$cell_state WHERE ROWNUM = 1;
+
+-- get user
+COL sessionuser NEW_V sessionuser FOR A50;
+SELECT TO_CHAR(SYS_CONTEXT('USERENV','SESSION_USER')) sessionuser FROM dual;
+
+-- get num_cpu
+COL num_cpus NEW_V num_cpus FOR A10
+SELECT TO_CHAR(value) num_cpus FROM v$osstat WHERE stat_name = 'NUM_CPUS';
+
+-- get num_cores
+COL num_cores NEW_V num_cores FOR A10
+SELECT TO_CHAR(value) num_cores FROM v$osstat WHERE stat_name = 'NUM_CPU_CORES';
+
+-- get num_cpu
+COL num_sockets NEW_V num_sockets FOR A10
+SELECT TO_CHAR(value) num_sockets FROM v$osstat WHERE stat_name = 'NUM_CPU_SOCKETS';
+
+/* -------------------------
+ *
+ * application vendor
+ *
+ * ------------------------- */
+
+-- ebs
+COL is_ebs NEW_V is_ebs FOR A1;
+COL ebs_owner NEW_V ebs_owner FOR A30;
+SELECT 'Y' is_ebs, owner ebs_owner
+ FROM dba_tab_columns
+ WHERE table_name = 'FND_PRODUCT_GROUPS'
+ AND column_name = 'RELEASE_NAME'
+ AND data_type = 'VARCHAR2'
+ AND ROWNUM = 1;
+
+-- siebel
+COL is_siebel NEW_V is_siebel FOR A1;
+COL siebel_owner NEW_V siebel_owner FOR A30;
+SELECT 'Y' is_siebel, owner siebel_owner
+ FROM dba_tab_columns
+ WHERE '^^is_ebs.' IS NULL
+ AND table_name = 'S_REPOSITORY'
+ AND column_name = 'ROW_ID'
+ AND data_type = 'VARCHAR2'
+ AND ROWNUM = 1;
+
+-- psft
+COL is_psft NEW_V is_psft FOR A1;
+COL psft_owner NEW_V psft_owner FOR A30;
+SELECT 'Y' is_psft, owner psft_owner
+ FROM dba_tab_columns
+ WHERE '^^is_ebs.' IS NULL
+ AND '^^is_siebel.' IS NULL
+ AND table_name = 'PSSTATUS'
+ AND column_name = 'TOOLSREL'
+ AND data_type = 'VARCHAR2'
+ AND ROWNUM = 1;
+
+/* -------------------------
+ *
+ * find tables and indexes
+ *
+ * ------------------------- */
+
+-- transaction begins here. it will be rolled back after generating spool file
+SAVEPOINT save_point_1;
+
+-- this script uses the gtt plan_table as a temporary staging place to store results of health-checks
+DELETE plan_table;
+
+-- record tables
+INSERT INTO plan_table (object_type, object_owner, object_name)
+WITH object AS (
+SELECT /*+ MATERIALIZE */
+ object_owner owner, object_name name
+ FROM gv$sql_plan
+ WHERE :health_checks = 'Y'
+ AND 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 :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id
+ AND object_owner IS NOT NULL
+ AND object_name IS NOT NULL
+)
+SELECT 'TABLE', t.owner, t.table_name
+ FROM dba_tab_statistics t, -- include fixed objects
+ object o
+ WHERE :health_checks = 'Y'
+ AND 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 :health_checks = 'Y'
+ AND i.owner = o.owner
+ AND i.index_name = o.name;
+
+-- list tables
+SELECT object_owner owner, object_name table_name
+ FROM plan_table
+ WHERE :health_checks = 'Y'
+ AND object_type = 'TABLE'
+ ORDER BY 1, 2;
+
+-- record indexes from known plans
+INSERT INTO plan_table (object_type, object_owner, object_name, other_tag)
+SELECT 'INDEX', object_owner owner, object_name index_name, 'YES'
+ FROM gv$sql_plan
+ WHERE :health_checks = 'Y'
+ AND 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
+ AND (object_type LIKE '%INDEX%' OR operation LIKE '%INDEX%')
+ UNION
+SELECT 'INDEX', object_owner owner, object_name index_name, 'YES'
+ FROM dba_hist_sql_plan
+ WHERE :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id
+ AND object_owner IS NOT NULL
+ AND object_name IS NOT NULL
+ AND (object_type LIKE '%INDEX%' OR operation LIKE '%INDEX%');
+
+-- record indexes from tables in plan
+INSERT INTO plan_table (object_type, object_owner, object_name, other_tag)
+SELECT 'INDEX', owner, index_name, 'NO'
+ FROM plan_table t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND t.object_type = 'TABLE'
+ AND t.object_owner = i.table_owner
+ AND t.object_name = i.table_name
+ MINUS
+SELECT 'INDEX', object_owner, object_name, 'NO'
+ FROM plan_table t
+ WHERE :health_checks = 'Y'
+ AND object_type = 'INDEX';
+
+COL in_plan FOR A7;
+-- list indexes
+SELECT object_owner owner, object_name index_name, other_tag in_plan
+ FROM plan_table
+ WHERE :health_checks = 'Y'
+ AND object_type = 'INDEX'
+ ORDER BY 1, 2;
+
+/* -------------------------
+ *
+ * record type enumerator
+ *
+ * ------------------------- */
+
+-- constants
+VAR E_GLOBAL NUMBER;
+VAR E_EBS NUMBER;
+VAR E_SIEBEL NUMBER;
+VAR E_PSFT NUMBER;
+VAR E_TABLE NUMBER;
+VAR E_INDEX NUMBER;
+VAR E_1COL_INDEX NUMBER;
+VAR E_TABLE_PART NUMBER;
+VAR E_INDEX_PART NUMBER;
+VAR E_TABLE_COL NUMBER;
+
+EXEC :E_GLOBAL := 01;
+EXEC :E_EBS := 02;
+EXEC :E_SIEBEL := 03;
+EXEC :E_PSFT := 04;
+EXEC :E_TABLE := 05;
+EXEC :E_INDEX := 06;
+EXEC :E_1COL_INDEX := 07;
+EXEC :E_TABLE_PART := 08;
+EXEC :E_INDEX_PART := 09;
+EXEC :E_TABLE_COL := 10;
+
+/**************************************************************************************************/
+
+/* -------------------------
+ *
+ * global hc
+ *
+ * ------------------------- */
+EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO('^^method.: Global Health Check - ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD/HH24:MI:SS'));
+
+-- 5969780 STATISTICS_LEVEL = ALL on LINUX
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, 'STATISTICS_LEVEL',
+ 'Parameter STATISTICS_LEVEL is set to ALL on ^^platform. platform.',
+ 'STATISTICS_LEVEL = ALL provides valuable metrics like A-Rows. Be aware of Bug 5969780 CPU overhead.
'||CHR(10)||
+ 'Use a value of ALL only at the session level. You could use CBO hint /*+ gather_plan_statistics */ to accomplish the same.'
+ FROM v$system_parameter2
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'STATISTICS_LEVEL'
+ AND UPPER(value) = 'ALL'
+ AND '^^rdbms_version.' LIKE '10%'
+ AND '^^platform.' LIKE '%LINUX%';
+
+-- cbo parameters with non-default values at sql level
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, UPPER(name),
+ 'CBO initialization parameter "'||name||'" with a non-default value of "'||value||'" as per V$SQL_OPTIMIZER_ENV.',
+ 'Review the correctness of this non-default value "'||value||'" for SQL_ID '||:sql_id||'.'
+ FROM (
+SELECT DISTINCT name, value
+ FROM v$sql_optimizer_env
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+ AND isdefault = 'NO' );
+
+-- cbo parameters with non-default values at system level
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, UPPER(g.name),
+ 'CBO initialization parameter "'||g.name||'" with a non-default value of "'||g.value||'" as per V$SYS_OPTIMIZER_ENV.',
+ 'Review the correctness of this non-default value "'||g.value||'".
'||CHR(10)||
+ 'Unset this parameter unless there is a strong reason for keeping its current value.
'||CHR(10)||
+ 'Default value is "'||g.default_value||'" as per V$SYS_OPTIMIZER_ENV.'
+ FROM v$sys_optimizer_env g
+ WHERE :health_checks = 'Y'
+ AND g.isdefault = 'NO'
+ AND NOT EXISTS (
+SELECT NULL
+ FROM v$sql_optimizer_env s
+ WHERE :health_checks = 'Y'
+ AND s.sql_id = :sql_id
+ AND s.isdefault = 'NO'
+ AND s.name = g.name
+ AND s.value = g.value );
+
+-- optimizer_features_enable <> rdbms_version at system level
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, 'OPTIMIZER_FEATURES_ENABLE',
+ 'DB version ^^rdbms_version. and OPTIMIZER_FEATURES_ENABLE ^^sys_ofe. do not match as per V$SYSTEM_PARAMETER2.',
+ 'Be aware that you are using a prior version of the optimizer. New CBO features in your DB version may not be used.'
+ FROM DUAL
+ WHERE :health_checks = 'Y'
+ AND SUBSTR('^^rdbms_version.', 1, LEAST(LENGTH('^^rdbms_version.'), LENGTH('^^sys_ofe.'))) <> SUBSTR('^^sys_ofe.', 1, LEAST(LENGTH('^^rdbms_version.'), LENGTH('^^sys_ofe.')));
+
+-- optimizer_features_enable <> rdbms_version at sql level
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, 'OPTIMIZER_FEATURES_ENABLE',
+ 'DB version ^^rdbms_version. and OPTIMIZER_FEATURES_ENABLE '||v.value||' do not match for SQL_ID '||:sql_id||' as per V$SQL_OPTIMIZER_ENV.',
+ 'Be aware that you are using a prior version of the optimizer. New CBO features in your DB version may not be used.'
+ FROM (
+SELECT DISTINCT value
+ FROM v$sql_optimizer_env
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+ AND LOWER(name) = 'optimizer_features_enable'
+ AND SUBSTR('^^rdbms_version.', 1, LEAST(LENGTH('^^rdbms_version.'), LENGTH(value))) <> SUBSTR(value, 1, LEAST(LENGTH('^^rdbms_version.'), LENGTH(value))) ) v;
+
+-- optimizer_dynamic_sampling between 1 and 3 at system level
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, 'OPTIMIZER_DYNAMIC_SAMPLING',
+ 'Dynamic Sampling is set to small value of ^^sys_ds. as per V$SYSTEM_PARAMETER2.',
+ 'Be aware that using such a small value may produce statistics of poor quality.
'||CHR(10)||
+ 'If you rely on this functionality consider using a value no smaller than 4.'
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND TO_NUMBER('^^sys_ds.') BETWEEN 1 AND 3
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.temporary = 'N'
+ AND (t.last_analyzed IS NULL OR t.num_rows IS NULL)
+ AND ROWNUM = 1;
+
+-- db_file_multiblock_read_count should not be set
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'CBO PARAMETER', SYSTIMESTAMP, 'DB_FILE_MULTIBLOCK_READ_COUNT',
+ 'MBRC Parameter is set to "'||value||'" overriding its default value.',
+ 'The default value of this parameter is a value that corresponds to the maximum I/O size that can be performed efficiently.
'||CHR(10)||
+ 'This value is platform-dependent and is 1MB for most platforms.
'||CHR(10)||
+ 'Because the parameter is expressed in blocks, it will be set to a value that is equal to the maximum I/O size that can be performed efficiently divided by the standard block size.'
+ FROM v$system_parameter2
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'DB_FILE_MULTIBLOCK_READ_COUNT'
+ AND (isdefault = 'FALSE' OR ismodified <> 'FALSE');
+
+-- nls_sort is not binary (session)
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'NLS PARAMETER', SYSTIMESTAMP, 'NLS_SORT',
+ 'NLS_SORT Session Parameter is set to "'||value||'" in V$NLS_PARAMETERS.',
+ 'Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer.'
+ FROM v$nls_parameters
+ WHERE :health_checks = 'Y'
+ AND UPPER(parameter) = 'NLS_SORT'
+ AND UPPER(value) <> 'BINARY';
+
+-- nls_sort is not binary (instance)
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'NLS PARAMETER', SYSTIMESTAMP, 'NLS_SORT',
+ 'NLS_SORT Instance Parameter is set to "'||value||'" in V$SYSTEM_PARAMETER.',
+ 'Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer.'
+ FROM v$system_parameter
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'NLS_SORT'
+ AND UPPER(value) <> 'BINARY';
+
+-- nls_sort is not binary (global)
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'NLS PARAMETER', SYSTIMESTAMP, 'NLS_SORT',
+ 'NLS_SORT Global Parameter is set to "'||value||'" in NLS_DATABASE_PARAMETERS.',
+ 'Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer.'
+ FROM nls_database_parameters
+ WHERE :health_checks = 'Y'
+ AND UPPER(parameter) = 'NLS_SORT'
+ AND UPPER(value) <> 'BINARY';
+
+-- DBMS_STATS automatic gathering on 10g
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'DBA_SCHEDULER_JOBS',
+ 'Automatic gathering of CBO statistics is enabled.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using FND_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Be aware that small sample sizes could produce poor quality histograms,
'||CHR(10)||
+ 'which combined with bind sensitive predicates could render suboptimal plans.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM dba_scheduler_jobs
+ WHERE :health_checks = 'Y'
+ AND job_name = 'GATHER_STATS_JOB'
+ AND enabled = 'TRUE';
+
+-- DBMS_STATS automatic gathering on 11g
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'DBA_AUTOTASK_CLIENT',
+ 'Automatic gathering of CBO statistics is enabled.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using FND_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Disable this job immediately and re-gather statistics for all affected schemas using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Be aware that small sample sizes could produce poor quality histograms,
'||CHR(10)||
+ 'which combined with bind sensitive predicates could render suboptimal plans.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM dba_autotask_client
+ WHERE :health_checks = 'Y'
+ AND client_name = 'auto optimizer stats collection'
+ AND status = 'ENABLED';
+
+-- DBMS_STATS automatic gathering on 11g but not running for a week
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'DBA_AUTOTASK_CLIENT',
+ 'Automatic gathering of CBO statistics is enabled but no job was
executed in the last 8 days',
+ 'The job is enabled in the system but there is no evidence it was ever
executed in the last 8 days.'
+ FROM dba_autotask_client
+ WHERE :health_checks = 'Y'
+ AND client_name = 'auto optimizer stats collection'
+ AND status = 'ENABLED'
+ AND 0 = (SELECT count(*)
+ FROM dba_autotask_client_history
+ WHERE client_name = 'auto optimizer stats collection'
+ AND window_start_time > (SYSDATE-8));
+
+-- DBMS_STATS automatic gathering on 11g but some jobs not running for a week
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'DBA_AUTOTASK_CLIENT',
+ 'Automatic gathering of CBO statistics is enabled but some job did
not complete in the last 8 days.',
+ 'The job is enabled in the system but there are some jobs in the
last 8 days that did not complete.'
+ FROM dba_autotask_client
+ WHERE :health_checks = 'Y'
+ AND client_name = 'auto optimizer stats collection'
+ AND status = 'ENABLED'
+ AND 0 <> (SELECT count(*)
+ FROM dba_autotask_client_history
+ WHERE client_name = 'auto optimizer stats collection'
+ AND window_start_time > (SYSDATE-8)
+ AND (jobs_created-jobs_started > 0 OR jobs_started-jobs_completed > 0));
+
+-- multiple CBO environments in SQL Area
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'OPTIMIZER_ENV',
+ 'SQL Area references '||COUNT(DISTINCT optimizer_env_hash_value)||' distinct CBO Environments for this one SQL.',
+ 'Distinct CBO Environments may produce different Plans.'
+ FROM gv$sqlarea_plan_hash
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+HAVING COUNT(*) > 1;
+
+-- multiple CBO environments in GV$SQL
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'OPTIMIZER_ENV',
+ 'GV$SQL references '||COUNT(DISTINCT optimizer_env_hash_value)||' distinct CBO Environments for this one SQL.',
+ 'Distinct CBO Environments may produce different Plans.'
+ FROM gv$sql
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+HAVING COUNT(*) > 1;
+
+-- multiple CBO environments in AWR
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'OPTIMIZER_ENV',
+ 'AWR references '||COUNT(DISTINCT optimizer_env_hash_value)||' distinct CBO Enviornments for this one SQL.',
+ 'Distinct CBO Environments may produce different Plans.'
+ FROM dba_hist_sqlstat
+ WHERE :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id
+HAVING COUNT(*) > 1;
+
+-- multiple plans with same PHV but different predicate ordering
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'PREDICATES ORDERING',
+ 'There are plans with same PHV '||v.plan_hash_value||' but different predicate ordering.',
+ 'Different ordering in the predicates for '||v.plan_hash_value||' can affect the performance of this SQL,
'||CHR(10)||
+ 'focus on Step ID '||v.id||' predicates '||v.predicates||' .'
+ FROM (
+WITH d AS (
+SELECT sql_id,
+ plan_hash_value,
+ id,
+ COUNT(DISTINCT access_predicates) distinct_access_predicates,
+ COUNT(DISTINCT filter_predicates) distinct_filter_predicates
+ FROM gv$sql_plan_statistics_all
+ WHERE sql_id = :sql_id
+ GROUP BY
+ sql_id,
+ plan_hash_value,
+ id
+HAVING MIN(NVL(access_predicates, 'X')) != MAX(NVL(access_predicates, 'X'))
+ OR MIN(NVL(filter_predicates, 'X')) != MAX(NVL(filter_predicates, 'X'))
+)
+SELECT v.plan_hash_value,
+ v.id,
+ 'access' type,
+ v.inst_id,
+ v.child_number,
+ v.access_predicates predicates
+ FROM d,
+ gv$sql_plan_statistics_all v
+ WHERE v.sql_id = d.sql_id
+ AND v.plan_hash_value = d.plan_hash_value
+ AND v.id = d.id
+ AND d.distinct_access_predicates > 1
+ UNION ALL
+SELECT v.plan_hash_value,
+ v.id,
+ 'filter' type,
+ v.inst_id,
+ v.child_number,
+ v.filter_predicates predicates
+ FROM d,
+ gv$sql_plan_statistics_all v
+ WHERE v.sql_id = d.sql_id
+ AND v.plan_hash_value = d.plan_hash_value
+ AND v.id = d.id
+ AND d.distinct_filter_predicates > 1
+ ORDER BY
+ 1, 2, 3, 6, 4, 5) v
+ WHERE :health_checks = 'Y' ;
+
+-- plans with implicit data_type conversion
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'PLAN_HASH_VALUE',
+ 'Plan '||v.plan_hash_value||' may have implicit data_type conversion functions in Filter Predicates.',
+ 'Review Execution Plans.
'||CHR(10)||
+ 'If Filter Predicates for '||v.plan_hash_value||' include unexpected INTERNAL_FUNCTION to perform an implicit data_type conversion,
'||CHR(10)||
+ 'be sure it is not preventing a column from being used as an Access Predicate.'
+ FROM (
+SELECT DISTINCT plan_hash_value
+ FROM gv$sql_plan
+ WHERE :health_checks = 'Y'
+ AND inst_id IN (SELECT inst_id FROM gv$instance)
+ AND sql_id = :sql_id
+ AND filter_predicates LIKE '%INTERNAL_FUNCTION%'
+ ORDER BY 1) v;
+
+-- plan operations with cost 0 and card 1
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PLAN', SYSTIMESTAMP, 'PLAN_HASH_VALUE',
+ 'Plan '||v.plan_hash_value||' has operations with Cost 0 and Card 1. Possible incorrect Selectivity.',
+ 'Review Execution Plans.
'||CHR(10)||
+ 'Look for Plan operations in '||v.plan_hash_value||' where Cost is 0 and Estimated Cardinality is 1.
'||CHR(10)||
+ 'Suspect predicates out of range or incorrect statistics.'
+ FROM (
+SELECT plan_hash_value
+ FROM gv$sql_plan
+ WHERE :health_checks = 'Y'
+ AND inst_id IN (SELECT inst_id FROM gv$instance)
+ AND sql_id = :sql_id
+ AND cost = 0
+ AND cardinality = 1
+ UNION
+SELECT plan_hash_value
+ FROM dba_hist_sql_plan
+ WHERE :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id
+ AND cost = 0
+ AND cardinality = 1) v;
+
+-- high version count
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'VERSION COUNT', SYSTIMESTAMP, 'VERSION COUNT',
+ 'This SQL shows evidence of high version count of '||MAX(v.version_count)||'.',
+ 'Review Execution Plans for details.'
+ FROM (
+SELECT MAX(version_count) version_count
+ FROM gv$sqlarea_plan_hash
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+ UNION
+SELECT MAX(version_count) version_count
+ FROM dba_hist_sqlstat
+ WHERE :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id ) v
+HAVING MAX(v.version_count) > 20;
+
+-- first rows
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'OPTIMZER MODE', SYSTIMESTAMP, 'FIRST_ROWS',
+ 'OPTIMIZER_MODE was set to FIRST_ROWS in '||v.pln_count||' Plan(s).',
+ 'The optimizer uses a mix of cost and heuristics to find a best plan for fast delivery of the first few rows.
'||CHR(10)||
+ 'Using heuristics sometimes leads the query optimizer to generate a plan with a cost that is significantly larger than the cost of a plan without applying the heuristic.
'||CHR(10)||
+ 'FIRST_ROWS is available for backward compatibility and plan stability; use FIRST_ROWS_n instead.'
+FROM (
+SELECT COUNT(*) pln_count
+ FROM (
+SELECT plan_hash_value
+ FROM gv$sql
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+ AND optimizer_mode = 'FIRST_ROWS'
+ UNION
+SELECT plan_hash_value
+ FROM dba_hist_sqlstat
+ WHERE :health_checks = 'Y'
+ AND :license IN ('T', 'D')
+ AND dbid = ^^dbid.
+ AND sql_id = :sql_id
+ AND optimizer_mode = 'FIRST_ROWS') v) v
+ WHERE :health_checks = 'Y'
+ AND v.pln_count > 0;
+
+-- fixed objects missing stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'FIXED OBJECTS', SYSTIMESTAMP, 'DBA_TAB_COL_STATISTICS',
+ 'There exist(s) '||v.tbl_count||' Fixed Object(s) accessed by this SQL without CBO statistics.',
+ 'Consider gathering statistics for fixed objects using DBMS_STATS.GATHER_FIXED_OBJECTS_STATS.
'||CHR(10)||
+ 'See 465787.1.'
+FROM (
+SELECT COUNT(*) tbl_count
+ FROM plan_table pt,
+ dba_tab_statistics t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.object_type = 'FIXED TABLE'
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND t.owner = c.owner
+ AND t.table_name = c.table_name )) v
+ WHERE :health_checks = 'Y'
+ AND v.tbl_count > 0;
+
+-- system statistics not gathered
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Workload CBO System Statistics are not gathered. CBO is using default values.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'CPUSPEED'
+ AND pval1 IS NULL;
+
+-- mreadtim < sreadtim
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Multi-block read time of '||a1.pval1||'ms seems too small compared to single-block read time of '||a2.pval1||'ms.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting SREADTIM and MREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1.'
+ FROM sys.aux_stats$ a1, sys.aux_stats$ a2
+ WHERE :health_checks = 'Y'
+ AND a1.sname = 'SYSSTATS_MAIN'
+ AND a1.pname = 'MREADTIM'
+ AND a2.sname = 'SYSSTATS_MAIN'
+ AND a2.pname = 'SREADTIM'
+ AND a1.pval1 < a2.pval1;
+
+-- (1.2 * sreadtim) > mreadtim > sreadtim
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Multi-block read time of '||a1.pval1||'ms seems too small compared to single-block read time of '||a2.pval1||'ms.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting SREADTIM and MREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1.'
+ FROM sys.aux_stats$ a1, sys.aux_stats$ a2
+ WHERE :health_checks = 'Y'
+ AND a1.sname = 'SYSSTATS_MAIN'
+ AND a1.pname = 'MREADTIM'
+ AND a2.sname = 'SYSSTATS_MAIN'
+ AND a2.pname = 'SREADTIM'
+ AND (1.2 * a2.pval1) > a1.pval1
+ AND a1.pval1 > a2.pval1;
+
+-- sreadtim < 2
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Single-block read time of '||pval1||' milliseconds seems too small.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting SREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'SREADTIM'
+ AND pval1 < 2
+ AND NVL('^^exadata.','N') = 'N';
+
+-- mreadtim < 3
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Multi-block read time of '||pval1||' milliseconds seems too small.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting MREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'MREADTIM'
+ AND pval1 < 3
+ AND NVL('^^exadata.','N') = 'N';
+
+-- sreadtim > 18
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Single-block read time of '||pval1||' milliseconds seems too large.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting SREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1 and Bug 9842771.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'SREADTIM'
+ AND pval1 > 18
+ AND NVL('^^exadata.','N') = 'N';
+
+-- mreadtim > 522
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Multi-block read time of '||pval1||' milliseconds seems too large.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting MREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1 and Bug 9842771.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'MREADTIM'
+ AND pval1 > 522
+ AND NVL('^^exadata.','N') = 'N';
+
+-- sreadtim not between 0.5 and 10 in Exadata
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Single-block read time of '||pval1||' milliseconds seems unlikely for an Exadata system.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting SREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1 and Bug 9842771.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'SREADTIM'
+ AND pval1 NOT BETWEEN 0.5 AND 10
+ AND '^^exadata.' = 'Y';
+
+-- mreadtim not between 0.5 and 10 in Exadata
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'DBMS_STATS', SYSTIMESTAMP, 'SYSTEM STATISTICS',
+ 'Multi-block read time of '||pval1||' milliseconds seems unlikely for an Exadata system.',
+ 'Consider gathering workload system statistics using DBMS_STATS.GATHER_SYSTEM_STATS or adjusting MREADTIM using DBMS_STATS.SET_SYSTEM_STATS.
'||CHR(10)||
+ 'See also 465787.1 and Bug 9842771.'
+ FROM sys.aux_stats$
+ WHERE :health_checks = 'Y'
+ AND sname = 'SYSSTATS_MAIN'
+ AND pname = 'MREADTIM'
+ AND pval1 NOT BETWEEN 0.5 AND 10
+ AND '^^exadata.' = 'Y';
+
+-- exadata specific check, offload disabled because of bad timezone file to cells (bug 11836425)
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'OFFLOAD', SYSTIMESTAMP, 'OFFLOAD OFF',
+ 'Due to a timezone upgrade pending the offload might be disabled.',
+ 'Offload might get rejected if the cells don''t have the propert timezone file.'
+ FROM database_properties
+ WHERE :health_checks = 'Y'
+ AND property_name = 'DST_UPGRADE_STATE'
+ AND property_value<>'NONE'
+ AND ROWNUM = 1
+ AND '^^exadata.' = 'Y';
+
+-- Exadata specific check, offload disabled because tables with CACHE = YES
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'OFFLOAD', SYSTIMESTAMP, 'OFFLOAD OFF',
+ 'There is/are tables(s) with property CACHE = ''Y'', this causes offload to be disabled on it/them.',
+ 'Offload is not used for tables that have property CACHE = ''Y''.'
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.object_type = 'TABLE'
+ AND ROWNUM = 1
+ AND t.cache = 'Y'
+ AND '^^exadata.' = 'Y';
+
+-- Exadata specific check, offload disabled for SQL executed by shared servers
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'OFFLOAD', SYSTIMESTAMP, 'OFFLOAD OFF',
+ 'Offload is not used for SQLs executed from Shared Server.',
+ 'SQLs executed by Shared Server cannot be offloaded since they don''t use direct path reads.'
+ FROM v$system_parameter2
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'SHARED_SERVERS'
+ AND UPPER(value) > 0
+ AND '^^exadata.' = 'Y';
+
+-- Exadata specific check, offload disabled for serial DML
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'OFFLOAD', SYSTIMESTAMP, 'OFFLOAD OFF',
+ 'Offload is not used for SQLs that don''t use direct path reads.',
+ 'Serial DMLs cannot be offloaded by default since they don''t use direct path reads
'||CHR(10)||
+ 'If this execution is serial then make sure to use direct path reads or offload won'' be possible.'
+ FROM v$sql
+ WHERE :health_checks = 'Y'
+ AND TRIM(UPPER(SUBSTR(LTRIM(sql_text),1,6))) IN ('INSERT','UPDATE','DELETE','MERGE')
+ AND sql_id = '^^sql_id.'
+ AND ROWNUM = 1
+ AND '^^exadata.' = 'Y';
+
+-- AutoDOP and no IO Calibration
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PX', SYSTIMESTAMP, 'AUTODOP OFF',
+ 'AutoDOP is enable but there are no IO Calibration stats.',
+ 'AutoDOP requires IO Calibration stats, consider collecting them using DBMS_RESOURCE_MANAGER.CALIBRATE_IO.'
+ FROM v$system_parameter2
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'PARALLEL_DEGREE_POLICY'
+ AND UPPER(value) IN ('AUTO','LIMITED')
+ AND NOT EXISTS (SELECT 1
+ FROM v$dba_rsrc_io_calibrate);
+
+-- Manuaul DOP and Tables with DEFAULT degree
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'PX', SYSTIMESTAMP, 'MANUAL DOP WITH DEFAULT',
+ 'The DEGREE on some tables in set to DEFAULT and PARALLEL_DEGREE_POLICY is MANUAL',
+ 'DEFAULT degree combined with PARALLEL_DEGREE_POLICY = MANUAL might translate in a high degree of parallelism.'
+ FROM v$system_parameter2
+ WHERE :health_checks = 'Y'
+ AND UPPER(name) = 'PARALLEL_DEGREE_POLICY'
+ AND UPPER(value) = 'MANUAL'
+ AND EXISTS (SELECT 1
+ FROM plan_table pt,
+ dba_tables t
+ WHERE pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.object_type = 'TABLE'
+ AND t.degree = 'DEFAULT');
+
+-- sql with policies as per v$vpd_policy
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'VDP', SYSTIMESTAMP, 'V$VPD_POLICY',
+ 'Virtual Private Database. There is one or more policies affecting this SQL.',
+ 'Review Execution Plans and look for their injected predicates.'
+ FROM v$vpd_policy
+ WHERE :health_checks = 'Y'
+ AND sql_id = :sql_id
+HAVING COUNT(*) > 0;
+
+-- materialized views with rewrite enabled
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'MAT_VIEW', SYSTIMESTAMP, 'REWRITE_ENABLED',
+ 'There are '||COUNT(*)||' materialized views with rewrite enabled.',
+ 'A large number of materialized views could affect parsing time since CBO would have to evaluate each during a hard-parse.'
+ FROM v$system_parameter2 p,
+ dba_mviews m
+ WHERE :health_checks = 'Y'
+ AND UPPER(p.name) = 'QUERY_REWRITE_ENABLED'
+ AND UPPER(p.value) = 'TRUE'
+ AND m.rewrite_enabled = 'Y'
+HAVING COUNT(*) > 1;
+
+-- rewrite equivalences from DBMS_ADVANCED_REWRITE
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'REWRITE_EQUIVALENCE', SYSTIMESTAMP, 'REWRITE_EQUIVALENCE',
+ 'There is/are '||COUNT(*)||' rewrite equivalence(s) defined by the owner(s) of the involved objects.',
+ 'A rewrite equivalence makes the CBO rewrite the original SQL to a different one so that needs to be considered when analyzing the case.'
+ FROM dba_rewrite_equivalences m,
+ (SELECT DISTINCT object_owner owner FROM plan_table) o
+ WHERE :health_checks = 'Y'
+ AND m.owner = o.owner
+HAVING COUNT(*) > 0;
+
+-- table with bitmap index(es)
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'INDEX', SYSTIMESTAMP, 'BITMAP',
+ 'Your DML statement references '||COUNT(DISTINCT pt.object_name||pt.object_owner)||' Table(s) with at least one Bitmap index.',
+ 'Be aware that frequent DML operations operations in a Table with Bitmap indexes may produce contention where concurrent DML operations are common. If your SQL suffers of "TX-enqueue row lock contention" suspect this situation.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type = 'BITMAP'
+ AND EXISTS (
+SELECT NULL
+ FROM gv$sqlarea s
+ WHERE :health_checks = 'Y'
+ AND s.sql_id = :sql_id
+ AND s.command_type IN (2, 6, 7)) -- INSERT, UPDATE, DELETE
+HAVING COUNT(*) > 0;
+
+-- index in plan no longer exists
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT DISTINCT :E_INDEX, 'INDEX', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Index referenced by an Execution Plan no longer exists.',
+ 'If a Plan references a missing index then this Plan can no longer be generated by the CBO.'
+ FROM plan_table pt
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.other_tag = 'YES'
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name );
+
+-- index in plan is now unusable
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT DISTINCT :E_INDEX, 'INDEX', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Index referenced by an Execution Plan is now unusable.',
+ 'If a Plan references an unusable index then this Plan cannot be generated by the CBO.
'||CHR(10)||
+ 'If you need to enable tha Plan that references this index you need to rebuild it first.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.other_tag = 'YES'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'NO'
+ AND i.status = 'UNUSABLE';
+
+-- index in plan has now unusable partitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT DISTINCT :E_INDEX, 'INDEX', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Index referenced by an Execution Plan has now unusable partitions.',
+ 'If a Plan references an index with unusable partitions then this Plan cannot be generated by the CBO.
'||CHR(10)||
+ 'If you need to enable tha Plan that references this index you need to rebuild the unusable partitions first.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.other_tag = 'YES'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ AND p.status = 'UNUSABLE';
+
+-- index in plan has now unusable subpartitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT DISTINCT :E_INDEX, 'INDEX', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Index referenced by an Execution Plan has now unusable subpartitions.',
+ 'If a Plan references an index with unusable subpartitions then this Plan cannot be generated by the CBO.
'||CHR(10)||
+ 'If you need to enable tha Plan that references this index you need to rebuild the unusable subpartitions first.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_subpartitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.other_tag = 'YES'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ AND p.status = 'UNUSABLE';
+
+-- index in plan is now invisible
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT DISTINCT :E_INDEX, 'INDEX', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Index referenced by an Execution Plan is now invisible.',
+ 'If a Plan references an invisible index then this Plan cannot be generated by the CBO.
'||CHR(10)||
+ 'If you need to enable tha Plan that references this index you need to make this index visible.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.other_tag = 'YES'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'NO'
+ AND i.visibility = 'INVISIBLE';
+
+-- unusable indexes
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'INDEX', SYSTIMESTAMP, 'UNUSABLE',
+ 'There are '||COUNT(*)||' unusable index(es) in tables being accessed by your SQL.',
+ 'Unusable indexes cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'NO'
+ AND i.status = 'UNUSABLE'
+HAVING COUNT(*) > 0;
+
+-- unusable index partitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'INDEX PARTITION', SYSTIMESTAMP, 'UNUSABLE',
+ 'There are '||COUNT(*)||' unusable index partition(s) in tables being accessed by your SQL.',
+ 'Unusable index partitions cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ AND p.status = 'UNUSABLE'
+HAVING COUNT(*) > 0;
+
+-- unusable index subpartitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'INDEX SUBPARTITION', SYSTIMESTAMP, 'UNUSABLE',
+ 'There are '||COUNT(*)||' unusable index subpartition(s) in tables being accessed by your SQL.',
+ 'Unusable index subpartitions cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_subpartitions sp
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = sp.index_owner
+ AND pt.object_name = sp.index_name
+ AND sp.status = 'UNUSABLE'
+HAVING COUNT(*) > 0;
+
+-- invisible indexes
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_GLOBAL, 'INDEX', SYSTIMESTAMP, 'INVISIBLE',
+ 'There are '||COUNT(*)||' invisible index(es) in tables being accessed by your SQL.',
+ 'Invisible indexes cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.visibility = 'INVISIBLE'
+HAVING COUNT(*) > 0;
+
+/* -------------------------
+ *
+ * table hc
+ *
+ * ------------------------- */
+
+-- empty_blocks > blocks
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has more empty blocks ('||t.empty_blocks||') than actual blocks ('||t.blocks||') according to CBO statistics.',
+ 'Review Table statistics and consider re-organizing this Table.'
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.empty_blocks > t.blocks;
+
+-- table dop is set
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table''s DOP is "'||TRIM(t.degree)||'".',
+ 'Degree of parallelism greater than 1 may cause parallel-execution PX plans.
'||CHR(10)||
+ 'Review table properties and execute "ALTER TABLE '||pt.object_owner||'.'||pt.object_name||' NOPARALLEL" to reset degree of parallelism to 1 if PX plans are not desired.'
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND TRIM(t.degree) NOT IN ('0', '1', 'DEFAULT');
+
+-- table has indexes with dop set
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has '||COUNT(*)||' index(es) with DOP greater than 1.',
+ 'Degree of parallelism greater than 1 may cause parallel-execution PX plans.
'||CHR(10)||
+ 'Review index properties and execute "ALTER INDEX index_name NOPARALLEL" to reset degree of parallelism to 1 if PX plans are not desired.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND TRIM(i.degree) NOT IN ('0', '1', 'DEFAULT')
+ GROUP BY
+ pt.object_owner,
+ pt.object_name;
+
+-- index degree <> table degree
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has '||COUNT(*)||' index(es) with DOP different than its table.',
+ 'Table has a degree of parallelism of "'||TRIM(t.degree)||'".
'||CHR(10)||
+ 'Review index properties and fix degree of parallelism of table and/or its index(es).'
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND TRIM(t.degree) <> TRIM(i.degree)
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ TRIM(t.degree);
+
+-- no stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table lacks CBO Statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.temporary = 'N'
+ AND (t.last_analyzed IS NULL OR t.num_rows IS NULL);
+
+-- no rows
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Number of rows equal to zero according to table''s CBO statistics.',
+ CASE
+ WHEN t.temporary = 'Y' THEN
+ 'Consider deleting table statistics on this GTT using DBMS_STATS.DELETE_TABLE_STATS.'
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'If this table has rows consider gathering table statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has less than 15 rows consider deleting table statistics using DBMS_STATS.DELETE_TABLE_STATS,
'||CHR(10)||
+ 'else gathering table statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'If this table has rows consider gathering table statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows = 0;
+
+-- siebel small tables with CBO statistics
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Small table with CBO statistics.',
+ 'Consider deleting table statistics on this small table using DBMS_STATS.DELETE_TABLE_STATS.
'||CHR(10)||
+ 'See 781927.1.'
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND '^^is_siebel.' = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows < 15;
+
+-- small sample size
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Sample size of '||v.sample_size||' rows may be too small for table with '||v.num_rows||' rows.',
+ 'Sample percent used was:'||TRIM(TO_CHAR(ROUND(v.ratio * 100, 2), '99999990D00'))||'%.
'||CHR(10)||
+ 'Consider gathering better quality table statistics with DBMS_STATS.AUTO_SAMPLE_SIZE on 11g or with a sample size of '||ROUND(v.factor * 100)||'% on 10g.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.num_rows,
+ t.sample_size,
+ (t.sample_size / t.num_rows) ratio,
+ CASE
+ WHEN t.num_rows < 1e6 THEN -- up to 1M then 100%
+ 1
+ WHEN t.num_rows < 1e7 THEN -- up to 10M then 30%
+ 3/10
+ WHEN t.num_rows < 1e8 THEN -- up to 100M then 10%
+ 1/10
+ WHEN t.num_rows < 1e9 THEN -- up to 1B then 3%
+ 3/100
+ ELSE -- more than 1B then 1%
+ 1/100
+ END factor
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.sample_size > 0
+ AND t.last_analyzed IS NOT NULL ) v
+ WHERE :health_checks = 'Y'
+ AND v.ratio < (9/10) * v.factor;
+
+-- old stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table CBO statistics are '||ROUND(SYSDATE - v.last_analyzed)||' days old: '||TO_CHAR(v.last_analyzed, 'YYYY-MM-DD/HH24:MI:SS')||'.',
+ 'Consider gathering better quality table statistics with DBMS_STATS.AUTO_SAMPLE_SIZE on 11g or with a sample size of '||ROUND(v.factor * 100)||'% on 10g.
'||CHR(10)||
+ 'Old statistics could contain low/high values for which a predicate may be out of range, producing then a poor plan.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.last_analyzed,
+ t.num_rows,
+ t.sample_size,
+ (t.sample_size / t.num_rows) ratio,
+ CASE
+ WHEN t.num_rows < 1e6 THEN -- up to 1M then 100%
+ 1
+ WHEN t.num_rows < 1e7 THEN -- up to 10M then 30%
+ 3/10
+ WHEN t.num_rows < 1e8 THEN -- up to 100M then 10%
+ 1/10
+ WHEN t.num_rows < 1e9 THEN -- up to 1B then 3%
+ 3/100
+ ELSE -- more than 1B then 1%
+ 1/100
+ END factor
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.sample_size > 0
+ AND t.last_analyzed IS NOT NULL ) v
+ WHERE :health_checks = 'Y'
+ AND (v.last_analyzed < SYSDATE - 49
+ OR (v.num_rows BETWEEN 0 AND 1e6 AND v.last_analyzed < SYSDATE - 21)
+ OR (v.num_rows BETWEEN 1e6 AND 1e7 AND v.last_analyzed < SYSDATE - 28)
+ OR (v.num_rows BETWEEN 1e7 AND 1e8 AND v.last_analyzed < SYSDATE - 35)
+ OR (v.num_rows BETWEEN 1e8 AND 1e9 AND v.last_analyzed < SYSDATE - 42));
+
+
+-- extended statistics
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has '||COUNT(*)||' CBO statistics extension(s).',
+ 'Review table statistics extensions. Extensions can be used for expressions or column groups.
'||CHR(10)||
+ 'If your SQL contain matching predicates these extensions can influence the CBO.'
+ FROM plan_table pt,
+ dba_stat_extensions e
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = e.owner
+ AND pt.object_name = e.table_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name;
+
+-- columns with no stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Contains '||COUNT(*)||' column(s) with missing CBO statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.last_analyzed IS NULL
+ GROUP BY
+ pt.object_owner,
+ pt.object_name;
+
+-- columns missing low/high values
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Contains '||COUNT(*)||' column(s) with null low/high values.',
+ 'CBO cannot compute correct selectivity with these column statistics missing.
'||CHR(10)||
+ 'You may possibly have Bug 10248781
'||CHR(10)||
+ 'Consider gathering statistics for this table.'
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.last_analyzed IS NOT NULL
+ AND c.num_distinct > 0
+ AND (c.low_value IS NULL OR c.high_value IS NULL)
+ GROUP BY
+ pt.object_owner,
+ pt.object_name;
+
+-- columns with old stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains column(s) with outdated CBO statistics for up to '||TRUNC(ABS(v.tbl_last_analyzed - v.col_last_analyzed))||' day(s).',
+ 'CBO table and column statistics are inconsistent. Consider gathering statistics for this table.
'||CHR(10)||
+ 'Old statistics could contain low/high values for which a predicate may be out of range, producing then a poor plan.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.last_analyzed tbl_last_analyzed,
+ MIN(c.last_analyzed) col_last_analyzed
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.last_analyzed IS NOT NULL
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.last_analyzed ) v
+ WHERE :health_checks = 'Y'
+ AND ABS(v.tbl_last_analyzed - v.col_last_analyzed) > 1;
+
+-- more nulls than rows
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Number of nulls greater than number of rows by more than 10% in '||v.col_count||' column(s).',
+ 'There cannot be more rows with null value in a column than actual rows in the table.
'||CHR(10)||
+ 'Worst column shows '||v.num_nulls||' nulls while table has '||v.tbl_num_rows||' rows.
'||CHR(10)||
+ 'CBO table and column statistics are inconsistent. Consider gathering statistics for this table using a large sample size.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.num_rows tbl_num_rows,
+ COUNT(*) col_count,
+ MAX(c.num_nulls) num_nulls
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.num_nulls > t.num_rows
+ AND (c.num_nulls - t.num_rows) > t.num_rows * 0.1
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.num_rows ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- more distinct values than rows
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Number of distinct values greater than number of rows by more than 10% in '||v.col_count||' column(s).',
+ 'There cannot be a larger number of distinct values in a column than actual rows in the table.
'||CHR(10)||
+ 'Worst column shows '||v.num_distinct||' distinct values while table has '||v.tbl_num_rows||' rows.
'||CHR(10)||
+ 'CBO table and column statistics are inconsistent. Consider gathering statistics for this table using a large sample size.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.num_rows tbl_num_rows,
+ COUNT(*) col_count,
+ MAX(c.num_distinct) num_distinct
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.num_distinct > t.num_rows
+ AND (c.num_distinct - t.num_rows) > t.num_rows * 0.1
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.num_rows ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- zero distinct values on columns with value
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Number of distinct values is zero in at least '||v.col_count||' column(s) with value.',
+ 'There should not be columns with value ((num_rows - num_nulls) greater than 0) where the number of distinct values for the same column is zero.
'||CHR(10)||
+ 'Worst column shows '||(v.tbl_num_rows - v.num_nulls)||' rows with value while the number of distinct values for it is zero.
'||CHR(10)||
+ 'CBO table and column statistics are inconsistent. Consider gathering statistics for this table using a large sample size.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.num_rows tbl_num_rows,
+ COUNT(*) col_count,
+ MIN(c.num_nulls) num_nulls
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND t.num_rows > c.num_nulls
+ AND c.num_distinct = 0
+ AND (t.num_rows - c.num_nulls) > t.num_rows * 0.1
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.num_rows ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- 9885553 incorrect NDV in long char column with histogram
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains '||v.col_count||' long CHAR column(s) with Histogram. Number of distinct values (NDV) could be incorrect.',
+ 'Possible Bug 9885553.
'||CHR(10)||
+ 'When building histogram for a varchar column that is long, we only use its first 32 characters.
'||CHR(10)||
+ 'Two distinct values that share the same first 32 characters are deemed the same in the histogram.
'||CHR(10)||
+ 'Therefore the NDV derived from the histogram is inaccurate.'||CHR(10)||
+ 'If NDV is wrong then drop the Histogram.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) col_count
+ FROM plan_table pt,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.num_distinct > 0
+ AND c.data_type LIKE '%CHAR%'
+ AND c.avg_col_len > 32
+ AND c.histogram IN ('FREQUENCY', 'HEIGHT BALANCED')
+ AND '^^rdbms_version.' < '11.2.0.3'
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- 10174050 frequency histograms with less buckets than NDV
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains '||v.col_count||' column(s) where the number of distinct values does not match the number of buckets.',
+ 'Review column statistics for this table and look for "Num Distinct" and "Num Buckets". If there are values missing from the frequency histogram you may have Bug 10174050.
'||CHR(10)||
+ 'If you are referencing in your predicates one of the missing values the CBO can over estimate table cardinality, and this may produce a sub-optimal plan.
'||CHR(10)||
+ 'You can either gather statistics with 100% or as a workaround: ALTER system/session "_fix_control"=''5483301:OFF'';'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) col_count
+ FROM plan_table pt,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.histogram = 'FREQUENCY'
+ AND c.num_distinct <> c.num_buckets
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- frequency histogram with 1 bucket
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains '||v.col_count||' column(s) where the number of buckets is 1 for a "FREQUENCY" histogram.',
+ 'Review column statistics for this table and look for "Num Buckets" and "Histogram". Possible Bugs '||
+ '1386119, '||
+ '4406309, '||
+ '4495422, '||
+ '4567767, '||
+ '5483301 or '||
+ '6082745.
'||CHR(10)||
+ 'If you are referencing in your predicates one of the missing values the CBO can over estimate table cardinality, and this may produce a sub-optimal plan.
'||CHR(10)||
+ 'You can either gather statistics with 100% or as a workaround: ALTER system/session "_fix_control"=''5483301:OFF'';'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) col_count
+ FROM plan_table pt,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.histogram = 'FREQUENCY'
+ AND c.num_buckets = 1
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- height balanced histogram with no popular values
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains '||v.col_count||' column(s) with no popular values on a "HEIGHT BALANCED" histogram.',
+ 'A Height-balanced histogram with no popular values is not helpful nor desired. Consider dropping this histogram by collecting new CBO statistics while using METHOD_OPT with SIZE 1.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) col_count
+ FROM plan_table pt,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.histogram = 'HEIGHT BALANCED'
+ AND c.num_buckets > 253
+ AND (SELECT COUNT(*)
+ FROM dba_tab_histograms h
+ WHERE :health_checks = 'Y'
+ AND h.owner = c.owner
+ AND h.table_name = c.table_name
+ AND h.column_name = c.column_name) > 253
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- 8543770 corrupted histogram
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains '||v.col_count||' column(s) with corrupted histogram.',
+ 'These columns have buckets with values out of order. Consider dropping those histogram by collecting new CBO statistics while using METHOD_OPT with SIZE 1. Possible Bugs '||
+ '8543770, '||
+ '10267075, '||
+ '12819221 or '||
+ '12876988.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) col_count
+ FROM plan_table pt,
+ dba_tab_cols c
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = c.owner
+ AND pt.object_name = c.table_name
+ AND c.num_distinct > 0
+ AND c.num_buckets > 1
+ AND (SELECT COUNT(*)
+ FROM (SELECT CASE WHEN LAG(endpoint_value) OVER (ORDER BY endpoint_number) > c1.endpoint_value THEN 1 else 0 END mycol
+ FROM dba_tab_histograms c1
+ WHERE :health_checks = 'Y'
+ AND c1.owner = c.owner
+ AND c1.table_name = c.table_name
+ AND c1.column_name = c.column_name)
+ WHERE mycol = 1) > 0
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.col_count > 0;
+
+-- analyze 236935.1
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'CBO statistics were gathered using deprecated ANALYZE command.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned table, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using FND_STATS instead.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned table, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using coe_siebel_stats.sql instead.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned table, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using pscbo_stats.sql instead.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'When ANALYZE is used on a non-partitioned table, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using DBMS_STATS instead.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND t.partitioned = 'NO'
+ AND t.global_stats = 'NO';
+
+-- derived stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'CBO statistics are being derived by aggregation from lower level objects.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using FND_STATS instead.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using coe_siebel_stats.sql instead.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using pscbo_stats.sql instead.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the table statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using DBMS_STATS instead.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND t.partitioned = 'YES'
+ AND t.global_stats = 'NO';
+
+-- tables with stale statistics
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has stale statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tab_statistics t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.object_type = 'TABLE'
+ AND t.stale_stats = 'YES';
+
+-- tables with locked statistics
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'TABLE', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Table has locked statistics.',
+ 'Review table statistics.'
+ FROM plan_table pt,
+ dba_tab_statistics t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.object_type = 'TABLE'
+ AND t.stattype_locked IN ('ALL', 'DATA');
+
+-- sql with policies as per dba_policies
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'DBA_POLICIES', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Virtual Private Database. There is one or more policies affecting this table.',
+ 'Review Execution Plans and look for their injected predicates.'
+ FROM plan_table pt,
+ dba_policies p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = p.object_owner
+ AND pt.object_name = p.object_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name
+HAVING COUNT(*) > 0
+ ORDER BY
+ pt.object_owner,
+ pt.object_name;
+
+-- sql with policies as per dba_audit_policies
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE, 'DBA_AUDIT_POLICIES', SYSTIMESTAMP, pt.object_owner||'.'||pt.object_name,
+ 'Fine-Grained Auditing. There is one or more audit policies affecting this table.',
+ 'Review Execution Plans and look for their injected predicates.'
+ FROM plan_table pt,
+ dba_audit_policies p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = p.object_schema
+ AND pt.object_name = p.object_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name
+HAVING COUNT(*) > 0
+ ORDER BY
+ pt.object_owner,
+ pt.object_name;
+
+-- table partitions with no stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE_PART, 'TABLE PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ v.no_stats||' out of '||v.par_count||' partition(s) lack(s) CBO statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering statistics using FND_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Consider gathering statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering statistics using DBMS_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count,
+ SUM(CASE WHEN p.last_analyzed IS NULL OR p.num_rows IS NULL THEN 1 ELSE 0 END) no_stats
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.table_owner
+ AND pt.object_name = p.table_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.no_stats > 0;
+
+-- table partitions where num rows = 0
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE_PART, 'TABLE PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ v.num_rows_zero||' out of '||v.par_count||' partition(s) with number of rows equal to zero according to partition''s CBO statistics.',
+ 'If these table partitions are not empty, consider gathering table statistics using GRANULARITY=>GLOBAL AND PARTITION.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count,
+ SUM(CASE WHEN p.num_rows = 0 THEN 1 ELSE 0 END) num_rows_zero
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.table_owner
+ AND pt.object_name = p.table_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.num_rows_zero > 0;
+
+-- table partitions with outdated stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE_PART, 'TABLE PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains partition(s) with table/partition CBO statistics out of sync for up to '||TRUNC(ABS(v.tbl_last_analyzed - v.par_last_analyzed))||' day(s).',
+ 'Table and partition statistics were gathered up to '||TRUNC(ABS(v.tbl_last_analyzed - v.par_last_analyzed))||' day(s) appart, so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider re-gathering table statistics using GRANULARITY=>GLOBAL AND PARTITION.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.last_analyzed tbl_last_analyzed,
+ COUNT(*) par_count,
+ MIN(p.last_analyzed) par_last_analyzed
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.table_owner
+ AND pt.object_name = p.table_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.last_analyzed ) v
+ WHERE :health_checks = 'Y'
+ AND ABS(v.tbl_last_analyzed - v.par_last_analyzed) > 1;
+
+-- partitions with no column stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE_PART, 'TABLE PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ v.no_stats||' column(s) lack(s) partition level CBO statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering statistics using FND_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Consider gathering statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering statistics using DBMS_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ (SELECT COUNT(DISTINCT c.column_name)
+ FROM dba_part_col_statistics c
+ WHERE :health_checks = 'Y'
+ AND c.owner = pt.object_owner
+ AND c.table_name = pt.object_name
+ AND c.last_analyzed IS NULL) no_stats
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.no_stats > 0;
+
+-- partition columns with outdated stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_TABLE_PART, 'TABLE PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Table contains column(s) with table/partition CBO statistics out of sync for up to '||TRUNC(ABS(v.tbl_last_analyzed - v.col_last_analyzed))||' day(s).',
+ 'Table and partition statistics were gathered up to '||TRUNC(ABS(v.tbl_last_analyzed - v.col_last_analyzed))||' day(s) appart, so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider re-gathering table statistics using GRANULARITY=>GLOBAL AND PARTITION.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ t.last_analyzed tbl_last_analyzed,
+ (SELECT MIN(c.last_analyzed)
+ FROM dba_part_col_statistics c
+ WHERE :health_checks = 'Y'
+ AND c.owner = pt.object_owner
+ AND c.table_name = pt.object_name
+ AND c.last_analyzed IS NOT NULL) col_last_analyzed
+ FROM plan_table pt,
+ dba_tables t
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND t.num_rows > 0
+ AND t.last_analyzed IS NOT NULL
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ t.last_analyzed ) v
+ WHERE :health_checks = 'Y'
+ AND ABS(v.tbl_last_analyzed - v.col_last_analyzed) > 1;
+
+/* -------------------------
+ *
+ * index hc
+ *
+ * ------------------------- */
+
+-- no stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Index lacks CBO Statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table and index statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table and index statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table and index statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table and index statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.last_analyzed IS NOT NULL
+ AND t.num_rows > 0
+ AND t.temporary = 'N'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND (i.last_analyzed IS NULL OR i.num_rows IS NULL);
+
+-- more rows in index than its table
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Index appears to have more rows ('||i.num_rows||') than its table ('||t.num_rows||') by '||ROUND(100 * (i.num_rows - t.num_rows) / t.num_rows)||'%.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table and index statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table and index statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table and index statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table and index statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.last_analyzed IS NOT NULL
+ AND t.num_rows > 0
+ AND t.temporary = 'N'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.num_rows > t.num_rows
+ AND (i.num_rows - t.num_rows) > t.num_rows * 0.1;
+
+-- clustering factor > rows in table
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Clustering factor of '||i.clustering_factor||' is larger than number of rows in its table ('||t.num_rows||') by more than '||ROUND(100 * (i.clustering_factor - t.num_rows) / t.num_rows)||'%.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering table and index statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'If table has more than 15 rows consider gathering table and index statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering table and index statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering table and index statistics using DBMS_STATS.GATHER_TABLE_STATS.'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.last_analyzed IS NOT NULL
+ AND t.temporary = 'N'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.clustering_factor > t.num_rows
+ AND (i.clustering_factor - t.num_rows) > t.num_rows * 0.1;
+
+-- stats on zero while columns have value
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Index CBO statistics on 0 with indexed columns with value.',
+ 'This index with zeroes in CBO index statistics contains columns for which there are values, so the index should not have statistics in zeroes.
'||CHR(10)||
+ 'Possible Bug 4055596. Consider gathering table statistics, or DROP and RE-CREATE index.'
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.last_analyzed IS NOT NULL
+ AND t.num_rows > 0
+ AND t.temporary = 'N'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.num_rows = 0
+ AND i.distinct_keys = 0
+ AND i.leaf_blocks = 0
+ AND i.blevel = 0
+ AND EXISTS (
+SELECT NULL
+ FROM dba_ind_columns ic,
+ dba_tab_cols tc
+ WHERE :health_checks = 'Y'
+ AND ic.index_owner = i.owner
+ AND ic.index_name = i.index_name
+ AND ic.table_owner = tc.owner
+ AND ic.table_name = tc.table_name
+ AND ic.column_name = tc.column_name
+ AND t.num_rows > tc.num_nulls
+ AND (t.num_rows - tc.num_nulls) > t.num_rows * 0.1);
+
+-- table/index stats out of sync
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Table/Index CBO statistics out of sync.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Table and index statistics were gathered '||TRUNC(ABS(t.last_analyzed - i.last_analyzed))||' day(s) appart,
'||CHR(10)||
+ 'so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider gathering table and index statistics using FND_STATS.GATHER_TABLE_STATS or coe_stats.sql.
'||CHR(10)||
+ 'See 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Table and index statistics were gathered '||TRUNC(ABS(t.last_analyzed - i.last_analyzed))||' day(s) appart,
'||CHR(10)||
+ 'so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'If table has more than 15 rows consider gathering table and index statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Table and index statistics were gathered '||TRUNC(ABS(t.last_analyzed - i.last_analyzed))||' day(s) appart,
'||CHR(10)||
+ 'so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider gathering table and index statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Table and index statistics were gathered '||TRUNC(ABS(t.last_analyzed - i.last_analyzed))||' day(s) appart,
'||CHR(10)||
+ 'so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider gathering table and index statistics using DBMS_STATS.GATHER_TABLE_STATS using CASCADE=>TRUE.'||CHR(10)||
+ 'See also 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_tables t,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.last_analyzed IS NOT NULL
+ AND t.num_rows > 0
+ AND t.temporary = 'N'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.last_analyzed IS NOT NULL
+ AND ABS(t.last_analyzed - i.last_analyzed) > 1;
+
+-- analyze 236935.1
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'CBO statistics were either gathered using deprecated ANALYZE command or derived by aggregation from lower level objects.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned index, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using FND_STATS instead.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned index, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using coe_siebel_stats.sql instead.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'When ANALYZE is used on a non-partitioned index, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using pscbo_stats.sql instead.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'When ANALYZE is used on a non-partitioned index, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using DBMS_STATS instead.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type = 'NORMAL'
+ AND i.last_analyzed IS NOT NULL
+ AND i.partitioned = 'NO'
+ AND i.global_stats = 'NO';
+
+-- derived stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'CBO statistics were either gathered using deprecated ANALYZE command or derived by aggregation from lower level objects.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using FND_STATS instead.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using coe_siebel_stats.sql instead.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using pscbo_stats.sql instead.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'When statistics are derived by aggregation from lower level objects, the global_stats column of the index statistics receives a value of ''NO''.
'||CHR(10)||
+ 'Consider gathering statistics using DBMS_STATS instead.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type = 'NORMAL'
+ AND i.last_analyzed IS NOT NULL
+ AND i.partitioned = 'YES'
+ AND i.global_stats = 'NO';
+
+-- unusable indexes
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Unusable index.',
+ 'Unusable indexes cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.partitioned = 'NO'
+ AND i.status = 'UNUSABLE';
+
+-- unusable index partitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX_PART, 'INDEX PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Index with '||v.par_count||' unusable partition(s).',
+ 'Unusable index partitions cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ AND p.status = 'UNUSABLE'
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.par_count > 0;
+
+-- unusable index subpartitions
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX_PART, 'INDEX SUBPARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Index with '||v.par_count||' unusable subpartition(s).',
+ 'Unusable index subpartitions cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_subpartitions sp
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = sp.index_owner
+ AND pt.object_name = sp.index_name
+ AND sp.status = 'UNUSABLE'
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.par_count > 0;
+
+-- invisible indexes
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX, 'INDEX', SYSTIMESTAMP, i.owner||'.'||i.index_name,
+ 'Invisible index.',
+ 'Invisible indexes cannot be used by the CBO. This may cause Execution Plans to change.'
+ FROM plan_table pt,
+ dba_indexes i
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.visibility = 'INVISIBLE';
+
+-- no column stats in single-column index
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_1COL_INDEX, '1-COL INDEX', SYSTIMESTAMP, i.index_name||'('||ic.column_name||')',
+ 'Lack of CBO statistics in column of this single-column index.',
+ 'To avoid CBO guessed statistics on this indexed column, gather table statistics and include this column in METHOD_OPT used.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_columns ic,
+ dba_tab_cols tc
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.last_analyzed IS NOT NULL
+ AND i.num_rows > 0
+ AND i.owner = ic.index_owner
+ AND i.index_name = ic.index_name
+ AND ic.column_position = 1
+ AND ic.table_owner = tc.owner
+ AND ic.table_name = tc.table_name
+ AND ic.column_name = tc.column_name
+ AND (tc.last_analyzed IS NULL OR tc.num_distinct IS NULL OR tc.num_nulls IS NULL)
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_ind_columns ic2
+ WHERE :health_checks = 'Y'
+ AND ic2.index_owner = i.owner
+ AND ic2.index_name = i.index_name
+ AND ic2.column_position = 2 );
+
+-- NDV on column > num_rows in single-column index
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_1COL_INDEX, '1-COL INDEX', SYSTIMESTAMP, i.index_name||'('||ic.column_name||')',
+ 'Single-column index with number of distinct values greater than number of rows by '||ROUND(100 * (tc.num_distinct - i.num_rows) / i.num_rows)||'%.',
+ 'There cannot be a larger number of distinct values ('||tc.num_distinct||') in a column than actual rows ('||i.num_rows||') in the index.
'||CHR(10)||
+ 'This is an inconsistency on this indexed column. Consider gathering table statistics using a large sample size.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_columns ic,
+ dba_tab_cols tc
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.last_analyzed IS NOT NULL
+ AND i.num_rows > 0
+ AND i.owner = ic.index_owner
+ AND i.index_name = ic.index_name
+ AND ic.column_position = 1
+ AND ic.table_owner = tc.owner
+ AND ic.table_name = tc.table_name
+ AND ic.column_name = tc.column_name
+ AND tc.num_distinct > i.num_rows
+ AND (tc.num_distinct - i.num_rows) > i.num_rows * 0.1
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_ind_columns ic2
+ WHERE :health_checks = 'Y'
+ AND ic2.index_owner = i.owner
+ AND ic2.index_name = i.index_name
+ AND ic2.column_position = 2 );
+
+-- NDV is zero but column has values in single-column index
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_1COL_INDEX, '1-COL INDEX', SYSTIMESTAMP, i.index_name||'('||ic.column_name||')',
+ 'Single-column index with number of distinct value equal to zero in column with value.',
+ 'There should not be columns with value where the number of distinct values for the same column is zero.
'||CHR(10)||
+ 'Column has '||(i.num_rows - tc.num_nulls)||' rows with value while the number of distinct values for it is zero.
'||CHR(10)||
+ 'This is an inconsistency on this indexed column. Consider gathering table statistics using a large sample size.'
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_columns ic,
+ dba_tab_cols tc
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.last_analyzed IS NOT NULL
+ AND i.num_rows > 0
+ AND i.owner = ic.index_owner
+ AND i.index_name = ic.index_name
+ AND ic.column_position = 1
+ AND ic.table_owner = tc.owner
+ AND ic.table_name = tc.table_name
+ AND ic.column_name = tc.column_name
+ AND tc.num_distinct = 0
+ AND i.num_rows > tc.num_nulls
+ AND (i.num_rows - tc.num_nulls) > i.num_rows * 0.1
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_ind_columns ic2
+ WHERE :health_checks = 'Y'
+ AND ic2.index_owner = i.owner
+ AND ic2.index_name = i.index_name
+ AND ic2.column_position = 2 );
+
+-- Bugs 4495422 or 9885553 NDV <> NDK in single-column index
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_1COL_INDEX, '1-COL INDEX', SYSTIMESTAMP, i.index_name||'('||ic.column_name||')',
+ 'Number of distinct values ('||tc.num_distinct||') does not match number of distinct keys ('||i.distinct_keys||') by '||ROUND(100 * (i.distinct_keys - tc.num_distinct) / tc.num_distinct)||'%.',
+ CASE
+ WHEN tc.data_type LIKE '%CHAR%' AND tc.num_buckets > 1 THEN
+ 'Possible Bug 4495422 or 9885553.
'||CHR(10)||
+ 'This is an inconsistency on this indexed column. Gather fresh statistics with no histograms or adjusting DISTCNT and DENSITY using SET_COLUMN_statistics APIs.'
+ ELSE
+ 'This is an inconsistency on this indexed column. Gather fresh statistics or adjusting DISTCNT and DENSITY using SET_COLUMN_statistics APIs.'
+ END
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_columns ic,
+ dba_tab_cols tc
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = i.table_owner
+ AND pt.object_name = i.table_name
+ AND i.index_type NOT IN ('DOMAIN', 'LOB', 'FUNCTION-BASED DOMAIN')
+ AND i.last_analyzed IS NOT NULL
+ AND i.num_rows > 0
+ AND i.owner = ic.index_owner
+ AND i.index_name = ic.index_name
+ AND ic.column_position = 1
+ AND ic.table_owner = tc.owner
+ AND ic.table_name = tc.table_name
+ AND ic.column_name = tc.column_name
+ AND tc.num_distinct > 0
+ AND i.distinct_keys > 0
+ AND i.distinct_keys > tc.num_distinct
+ AND (i.distinct_keys - tc.num_distinct) > tc.num_distinct * 0.1
+ AND NOT EXISTS (
+SELECT NULL
+ FROM dba_ind_columns ic2
+ WHERE :health_checks = 'Y'
+ AND ic2.index_owner = i.owner
+ AND ic2.index_name = i.index_name
+ AND ic2.column_position = 2 );
+
+-- index partitions with no stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX_PART, 'INDEX PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ v.no_stats||' out of '||v.par_count||' partition(s) lack(s) CBO statistics.',
+ CASE
+ WHEN '^^is_ebs.' = 'Y' THEN
+ 'Consider gathering statistics using FND_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See also 156968.1.'
+ WHEN '^^is_siebel.' = 'Y' THEN
+ 'Consider gathering statistics using coe_siebel_stats.sql.
'||CHR(10)||
+ 'See 781927.1.'
+ WHEN '^^is_psft.' = 'Y' THEN
+ 'Consider gathering statistics using pscbo_stats.sql.
'||CHR(10)||
+ 'See 1322888.1.'
+ ELSE
+ 'Consider gathering statistics using DBMS_STATS.GATHER_TABLE_STATISTICS.
'||CHR(10)||
+ 'See 465787.1.'
+ END
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count,
+ SUM(CASE WHEN p.last_analyzed IS NULL OR p.num_rows IS NULL THEN 1 ELSE 0 END) no_stats
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND i.num_rows > 0
+ AND i.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.no_stats > 0;
+
+-- index partitions where num rows = 0
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX_PART, 'INDEX PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ v.num_rows_zero||' out of '||v.par_count||' partition(s) with number of rows equal to zero according to partition''s CBO statistics.',
+ 'If these index partitions are not empty, consider gathering table statistics using GRANULARITY=>GLOBAL AND PARTITION.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ COUNT(*) par_count,
+ SUM(CASE WHEN p.num_rows = 0 THEN 1 ELSE 0 END) num_rows_zero
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND i.num_rows > 0
+ AND i.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name ) v
+ WHERE :health_checks = 'Y'
+ AND v.num_rows_zero > 0;
+
+-- index partitions with outdated stats
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+SELECT :E_INDEX_PART, 'INDEX PARTITION', SYSTIMESTAMP, v.object_owner||'.'||v.object_name,
+ 'Index contains partition(s) with index/partition CBO statistics out of sync for up to '||TRUNC(ABS(v.idx_last_analyzed - v.par_last_analyzed))||' day(s).',
+ 'Index and partition statistics were gathered up to '||TRUNC(ABS(v.idx_last_analyzed - v.par_last_analyzed))||' day(s) appart, so they do not offer a consistent view to the CBO.
'||CHR(10)||
+ 'Consider re-gathering table statistics using GRANULARITY=>GLOBAL AND PARTITION.'
+ FROM (
+SELECT pt.object_owner,
+ pt.object_name,
+ i.last_analyzed idx_last_analyzed,
+ COUNT(*) par_count,
+ MIN(p.last_analyzed) par_last_analyzed
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions p
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND i.num_rows > 0
+ AND i.last_analyzed IS NOT NULL
+ AND pt.object_owner = p.index_owner
+ AND pt.object_name = p.index_name
+ GROUP BY
+ pt.object_owner,
+ pt.object_name,
+ i.last_analyzed ) v
+ WHERE :health_checks = 'Y'
+ AND ABS(v.idx_last_analyzed - v.par_last_analyzed) > 1;
+
+-- table and index partitions do not match 14013094
+INSERT INTO plan_table (id, operation, object_alias, other_tag, remarks, projection)
+WITH idx AS (
+SELECT /*+ MATERIALIZE */
+ i.owner index_owner, i.index_name, i.table_owner, i.table_name, COUNT(*) index_partitions
+ FROM plan_table pt,
+ dba_indexes i,
+ dba_ind_partitions ip
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'INDEX'
+ AND pt.object_owner = i.owner
+ AND pt.object_name = i.index_name
+ AND i.partitioned = 'YES'
+ AND pt.object_owner = ip.index_owner
+ AND pt.object_name = ip.index_name
+ GROUP BY
+ i.owner, i.index_name, i.table_owner, i.table_name
+), tbl AS (
+SELECT /*+ MATERIALIZE */
+ t.owner table_owner, t.table_name, COUNT(*) table_partitions
+ FROM plan_table pt,
+ dba_tables t,
+ dba_tab_partitions tp
+ WHERE :health_checks = 'Y'
+ AND pt.object_type = 'TABLE'
+ AND pt.object_owner = t.owner
+ AND pt.object_name = t.table_name
+ AND t.partitioned = 'YES'
+ AND pt.object_owner = tp.table_owner
+ AND pt.object_name = tp.table_name
+ GROUP BY
+ t.owner, t.table_name
+), idx_tbl AS (
+SELECT /*+ MATERIALIZE */
+ idx.index_owner, idx.index_name, idx.table_owner, idx.table_name, idx.index_partitions partitions
+ FROM idx, tbl
+ WHERE idx.table_owner = tbl.table_owner
+ AND idx.table_name = tbl.table_name
+ AND idx.index_partitions = tbl.table_partitions
+)
+--SELECT idx_tbl.index_owner, idx_tbl.index_name, idx_tbl.table_owner, idx_tbl.table_name, COUNT(*)
+SELECT :E_INDEX_PART, 'INDEX PARTITION', SYSTIMESTAMP, idx_tbl.index_owner||'.'||idx_tbl.index_name,
+ 'Index contains '||COUNT(*)||' partition(s) where the partition name does not match to corresponding Table partition(s) name.',
+ 'Review Table and Index partition names and positions, then try to rule out Bug 14013094.'
+ FROM idx_tbl,
+ dba_tab_statistics tps,
+ dba_ind_statistics ips
+ WHERE tps.owner = idx_tbl.table_owner
+ AND tps.table_name = idx_tbl.table_name
+ AND tps.object_type = 'PARTITION'
+ AND ips.owner = idx_tbl.index_owner
+ AND ips.index_name = idx_tbl.index_name
+ AND ips.object_type = 'PARTITION'
+ AND tps.partition_position = ips.partition_position
+ AND tps.partition_name != ips.partition_name
+ GROUP BY
+ idx_tbl.index_owner, idx_tbl.index_name, idx_tbl.table_owner, idx_tbl.table_name;
+
+-- setup to produce reports
+SET ECHO OFF FEED OFF VER OFF SHOW OFF HEA OFF LIN 2000 NEWP NONE PAGES 0 LONG 2000000 LONGC 2000 SQLC MIX TAB ON TRIMS ON TI OFF TIMI OFF ARRAY 100 NUMF "" SQLP SQL> SUF sql BLO . RECSEP OFF APPI OFF AUTOT OFF;
+
+/**************************************************************************************************/
+
+COL files_prefix NEW_V files_prefix FOR A40;
+--SELECT '^^script._^^database_name_short._^^host_name_short._^^rdbms_version._^^sql_id._^^time_stamp.' files_prefix FROM DUAL;
+SELECT '^^script._^^time_stamp._^^sql_id.' files_prefix FROM DUAL;
+COL sqldx_prefix NEW_V sqldx_prefix FOR A40;
+SELECT '^^files_prefix._8_sqldx' sqldx_prefix FROM DUAL;
+
+/**************************************************************************************************
+ *
+ * health-check report
+ *
+ **************************************************************************************************/
+
+/* -------------------------
+ *
+ * heading
+ *
+ * ------------------------- */
+SPO ^^files_prefix._1_health_check.html;
+
+PRO
+PRO
+PRO
+PRO
+PRO
+PRO
+PRO License : ^^input_license. +PRO Input : ^^input_parameter. +PRO SIGNATURE : ^^signature. +PRO SIGNATUREF : ^^signaturef. +PRO RDBMS : ^^rdbms_version. +PRO Platform : ^^platform. +PRO Database : ^^database_name_short. +PRO DBID : ^^dbid. +PRO Host : ^^host_name_short. +PRO Instance : ^^instance_number. +PRO CPU_Count : ^^sys_cpu. +PRO Num CPUs : ^^num_cpus. +PRO Num Cores : ^^num_cores. +PRO Num Sockets: ^^num_sockets. +PRO Block Size : ^^sys_db_block_size. +PRO OFE : ^^sys_ofe. +PRO DYN_SAMP : ^^sys_ds. +PRO EBS : "^^is_ebs." +PRO SIEBEL : "^^is_siebel." +PRO PSFT : "^^is_psft." +PRO Date : ^^time_stamp2. +PRO User : ^^sessionuser. +PRO+ +PRO
# | +PROType | +PROName | +PROObservation | +PRODetails | +PRO
---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.object_type||' | '||CHR(10)|| + ''||v.object_name||' | '||CHR(10)|| + ''||v.observation||' | '||CHR(10)|| + ''||v.more||' | '||CHR(10)|| + '
# | +PROType | +PROName | +PROObservation | +PRODetails | +PRO
+ +DECLARE + l_sql_text CLOB := :sql_text; + l_pos NUMBER; +BEGIN + WHILE NVL(LENGTH(l_sql_text), 0) > 0 + LOOP + l_pos := INSTR(l_sql_text, CHR(10)); + IF l_pos > 0 THEN + DBMS_OUTPUT.PUT_LINE(SUBSTR(l_sql_text, 1, l_pos - 1)); + l_sql_text := SUBSTR(l_sql_text, l_pos + 1); + ELSE + DBMS_OUTPUT.PUT_LINE(l_sql_text); + l_sql_text := NULL; + END IF; + END LOOP; +END; +/ + +PRO+ +/* ------------------------- + * + * tables summary + * + * ------------------------- */ +EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO('^^method.: tables summary - ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD/HH24:MI:SS')); +PRO
# | +PROTable Name | +PROOwner | +PRONum Rows | +PROTable Sample Size |
+PRO Last Analyzed | +PROIndexes | +PROAvg Index Sample Size |
+PRO Table Columns |
+PRO Columns with Histogram |
+PRO Avg Column Sample Size |
+PRO
---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.table_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.table_sample_size||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.indexes||' | '||CHR(10)|| + ''||v.avg_index_sample_size||' | '||CHR(10)|| + ''||v.columns||' | '||CHR(10)|| + ''||v.columns_with_histograms||' | '||CHR(10)|| + ''||v.avg_column_sample_size||' | '||CHR(10)|| + '
# | +PROTable Name | +PROOwner | +PRONum Rows | +PROTable Sample Size |
+PRO Last Analyzed | +PROIndexes | +PROAvg Index Sample Size |
+PRO Table Columns |
+PRO Columns with Histogram |
+PRO Avg Column Sample Size |
+PRO
# | +PROTable Name | +PROTable Owner |
+PRO Index Name | +PROIndex Owner |
+PRO In MEM Plan |
+PRO In AWR Plan |
+PRO Num Rows | +PROIndex Sample Size |
+PRO Last Analyzed | +PROIndex Columns |
+PRO Columns with Histogram |
+PRO Avg Column Sample Size |
+PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.table_name||' | '||CHR(10)|| + ''||v.table_owner||' | '||CHR(10)|| + ''||v.index_name||' | '||CHR(10)|| + ''||v.index_owner||' | '||CHR(10)|| + ''||v.in_mem_plan||' | '||CHR(10)|| + ''||v.in_awr_plan||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.table_sample_size||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.columns||' | '||CHR(10)|| + ''||v.columns_with_histograms||' | '||CHR(10)|| + ''||v.avg_column_sample_size||' | '||CHR(10)|| + '
# | +PROTable Name | +PROTable Owner |
+PRO Index Name | +PROIndex Owner |
+PRO In MEM Plan |
+PRO In AWR Plan |
+PRO Num Rows | +PROIndex Sample Size |
+PRO Last Analyzed | +PROIndex Columns |
+PRO Columns with Histogram |
+PRO Avg Column Sample Size |
+PRO
+PRO License : ^^input_license. +PRO Input : ^^input_parameter. +PRO SIGNATURE : ^^signature. +PRO SIGNATUREF : ^^signaturef. +PRO RDBMS : ^^rdbms_version. +PRO Platform : ^^platform. +PRO Database : ^^database_name_short. +PRO DBID : ^^dbid. +PRO Host : ^^host_name_short. +PRO Instance : ^^instance_number. +PRO CPU_Count : ^^sys_cpu. +PRO Num CPUs : ^^num_cpus. +PRO Num Cores : ^^num_cores. +PRO Num Sockets: ^^num_sockets. +PRO Block Size : ^^sys_db_block_size. +PRO OFE : ^^sys_ofe. +PRO DYN_SAMP : ^^sys_ds. +PRO EBS : "^^is_ebs." +PRO SIEBEL : "^^is_siebel." +PRO PSFT : "^^is_psft." +PRO Date : ^^time_stamp2. +PRO User : ^^sessionuser. +PRO+ +PRO
+ +DECLARE + l_sql_text CLOB := :sql_text; + l_pos NUMBER; +BEGIN + WHILE NVL(LENGTH(l_sql_text), 0) > 0 + LOOP + l_pos := INSTR(l_sql_text, CHR(10)); + IF l_pos > 0 THEN + DBMS_OUTPUT.PUT_LINE(SUBSTR(l_sql_text, 1, l_pos - 1)); + l_sql_text := SUBSTR(l_sql_text, l_pos + 1); + ELSE + DBMS_OUTPUT.PUT_LINE(l_sql_text); + l_sql_text := NULL; + END IF; + END LOOP; +END; +/ + +PRO+ +/* ------------------------- + * + * dba_sql_plan_baselines + * + * ------------------------- */ +PRO
# | +PROReason | +PROInst | +PROCursors | +PRO
---|---|---|---|
# | +PROReason | +PROInst | +PROCursors | +PRO
# | +PROPlan HV | +PROAvg Elapsed Time (secs) |
+PRO Avg CPU Time (secs) |
+PRO Avg IO Time (secs) |
+PRO Avg Conc Time (secs) |
+PRO Avg Appl Time (secs) |
+PRO Avg Clus Time (secs) |
+PRO Avg PLSQL Time (secs) |
+PRO Avg Java Time (secs) |
+PRO Avg Buffer Gets |
+PRO Avg Disk Reads |
+PRO Avg Direct Writes |
+PRO Avg Rows Proc |
+PRO Total Execs |
+PRO Total Fetch |
+PRO Total Loads |
+PRO Total Inval |
+PRO Total Parse Calls |
+PRO Total Child Cursors |
+PRO Min Cost |
+PRO Max Cost |
+PRO Min Opt Env HV |
+PRO Max Opt Env HV |
+PRO First Load | +PROLast Load | +PROLast Active | +PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.plan_hash_value||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_elapsed_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_cpu_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_user_io_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_concurrency_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_application_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_cluster_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_plsql_exec_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_java_exec_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||v.avg_buffer_gets||' | '||CHR(10)|| + ''||v.avg_disk_reads||' | '||CHR(10)|| + ''||v.avg_direct_writes||' | '||CHR(10)|| + ''||v.avg_rows_processed||' | '||CHR(10)|| + ''||v.total_executions||' | '||CHR(10)|| + ''||v.total_fetches||' | '||CHR(10)|| + ''||v.total_loads||' | '||CHR(10)|| + ''||v.total_invalidations||' | '||CHR(10)|| + ''||v.total_parse_calls||' | '||CHR(10)|| + ''||v.child_cursors||' | '||CHR(10)|| + ''||v.min_optimizer_cost||' | '||CHR(10)|| + ''||DECODE(v.min_optimizer_cost, v.max_optimizer_cost, NULL, v.max_optimizer_cost)||' | '||CHR(10)|| + ''||v.min_optimizer_env_hash_value||' | '||CHR(10)|| + ''||DECODE(v.min_optimizer_env_hash_value, v.max_optimizer_env_hash_value, NULL, v.max_optimizer_env_hash_value)||' | '||CHR(10)|| + ''||v.first_load_time||' | '||CHR(10)|| + ''||v.last_load_time||' | '||CHR(10)|| + ''||TO_CHAR(v.last_active_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + '
# | +PROPlan HV | +PROAvg Elapsed Time (secs) |
+PRO Avg CPU Time (secs) |
+PRO Avg IO Time (secs) |
+PRO Avg Conc Time (secs) |
+PRO Avg Appl Time (secs) |
+PRO Avg Clus Time (secs) |
+PRO Avg PLSQL Time (secs) |
+PRO Avg Java Time (secs) |
+PRO Avg Buffer Gets |
+PRO Avg Disk Reads |
+PRO Avg Direct Writes |
+PRO Avg Rows Proc |
+PRO Total Execs |
+PRO Total Fetch |
+PRO Total Loads |
+PRO Total Inval |
+PRO Total Parse Calls |
+PRO Total Child Cursors |
+PRO Min Cost |
+PRO Max Cost |
+PRO Min Opt Env HV |
+PRO Max Opt Env HV |
+PRO First Load | +PROLast Load | +PROLast Active | +PRO
# | +PROInst ID |
+PRO Child Num |
+PRO Plan HV | +PROExecs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROOutline | +PROProfile | +PROFirst Load | +PROLast Load | +PROLast Active | +PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||inst_id||' | '||CHR(10)|| + ''||child_number||' | '||CHR(10)|| + ''||plan_hash_value||' | '||CHR(10)|| + ''||executions||' | '||CHR(10)|| + ''||fetches||' | '||CHR(10)|| + ''||loads||' | '||CHR(10)|| + ''||invalidations||' | '||CHR(10)|| + ''||parse_calls||' | '||CHR(10)|| + ''||buffer_gets||' | '||CHR(10)|| + ''||disk_reads||' | '||CHR(10)|| + ''||direct_writes||' | '||CHR(10)|| + ''||rows_processed||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(elapsed_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(cpu_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(user_io_wait_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(concurrency_wait_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(application_wait_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(cluster_wait_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(plsql_exec_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(java_exec_time / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||optimizer_mode||' | '||CHR(10)|| + ''||optimizer_cost||' | '||CHR(10)|| + ''||optimizer_env_hash_value||' | '||CHR(10)|| + ''||parsing_schema_name||' | '||CHR(10)|| + ''||module||' | '||CHR(10)|| + ''||action||' | '||CHR(10)|| + ''||outline_category||' | '||CHR(10)|| + ''||sql_profile||' | '||CHR(10)|| + ''||first_load_time||' | '||CHR(10)|| + ''||last_load_time||' | '||CHR(10)|| + ''||TO_CHAR(last_active_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + '
# | +PROInst ID |
+PRO Child Num |
+PRO Plan HV | +PROExecs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROOutline | +PROProfile | +PROFirst Load | +PROLast Load | +PROLast Active | +PRO
# | +PROPlan HV | +PROAvg Elapsed Time (secs) |
+PRO Avg CPU Time (secs) |
+PRO Avg IO Time (secs) |
+PRO Avg Conc Time (secs) |
+PRO Avg Appl Time (secs) |
+PRO Avg Clus Time (secs) |
+PRO Avg PLSQL Time (secs) |
+PRO Avg Java Time (secs) |
+PRO Avg Buffer Gets |
+PRO Avg Disk Reads |
+PRO Avg Direct Writes |
+PRO Avg Rows Proc |
+PRO Total Execs |
+--PRO Total Fetch |
+--PRO Total Loads |
+--PRO Total Inval |
+--PRO Total Parse Calls |
+PRO Min Cost |
+PRO Max Cost |
+PRO Min Opt Env HV |
+PRO Max Opt Env HV |
+PRO First Snapshot | +PROLast Snapshot | +PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.plan_hash_value||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_elapsed_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_cpu_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_user_io_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_concurrency_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_application_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_cluster_wait_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_plsql_exec_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(v.avg_java_exec_time_secs, '99999999999990D990')||' | '||CHR(10)|| + ''||v.avg_buffer_gets||' | '||CHR(10)|| + ''||v.avg_disk_reads||' | '||CHR(10)|| + ''||v.avg_direct_writes||' | '||CHR(10)|| + ''||v.avg_rows_processed||' | '||CHR(10)|| + ''||v.delta_executions||' | '||CHR(10)|| + --''||v.delta_fetches||' | '||CHR(10)|| + --''||v.delta_loads||' | '||CHR(10)|| + --''||v.delta_invalidations||' | '||CHR(10)|| + --''||v.delta_parse_calls||' | '||CHR(10)|| + ''||v.min_optimizer_cost||' | '||CHR(10)|| + ''||DECODE(v.min_optimizer_cost, v.max_optimizer_cost, NULL, v.max_optimizer_cost)||' | '||CHR(10)|| + ''||v.min_optimizer_env_hash_value||' | '||CHR(10)|| + ''||DECODE(v.min_optimizer_env_hash_value, v.max_optimizer_env_hash_value, NULL, v.max_optimizer_env_hash_value)||' | '||CHR(10)|| + ''||TO_CHAR(v.first_snap_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + ''||TO_CHAR(v.last_snap_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + '
# | +PROPlan HV | +PROAvg Elapsed Time (secs) |
+PRO Avg CPU Time (secs) |
+PRO Avg IO Time (secs) |
+PRO Avg Conc Time (secs) |
+PRO Avg Appl Time (secs) |
+PRO Avg Clus Time (secs) |
+PRO Avg PLSQL Time (secs) |
+PRO Avg Java Time (secs) |
+PRO Avg Buffer Gets |
+PRO Avg Disk Reads |
+PRO Avg Direct Writes |
+PRO Avg Rows Proc |
+PRO Total Execs |
+--PRO Total Fetch |
+--PRO Total Loads |
+--PRO Total Inval |
+--PRO Total Parse Calls |
+PRO Min Cost |
+PRO Max Cost |
+PRO Min Opt Env HV |
+PRO Max Opt Env HV |
+PRO First Snapshot | +PROLast Snapshot | +PRO
# | +PROSnap ID |
+PRO Snaphot | +PROInst ID |
+PRO Plan HV | +PROVers Cnt |
+PRO Execs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROProfile | +PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.snap_id||' | '||CHR(10)|| + ''||TO_CHAR(v.end_interval_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + ''||v.instance_number||' | '||CHR(10)|| + ''||v.plan_hash_value||' | '||CHR(10)|| + ''||v.version_count||' | '||CHR(10)|| + ''||v.executions_delta||' | '||CHR(10)|| + ''||v.fetches_delta||' | '||CHR(10)|| + ''||v.loads_delta||' | '||CHR(10)|| + ''||v.invalidations_delta||' | '||CHR(10)|| + ''||v.parse_calls_delta||' | '||CHR(10)|| + ''||v.buffer_gets_delta||' | '||CHR(10)|| + ''||v.disk_reads_delta||' | '||CHR(10)|| + ''||v.direct_writes_delta||' | '||CHR(10)|| + ''||v.rows_processed_delta||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.elapsed_time_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.cpu_time_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.iowait_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.ccwait_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.apwait_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.clwait_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.plsexec_time_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.javexec_time_delta / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||v.optimizer_mode||' | '||CHR(10)|| + ''||v.optimizer_cost||' | '||CHR(10)|| + ''||v.optimizer_env_hash_value||' | '||CHR(10)|| + ''||v.parsing_schema_name||' | '||CHR(10)|| + ''||v.module||' | '||CHR(10)|| + ''||v.action||' | '||CHR(10)|| + ''||v.sql_profile||' | '||CHR(10)|| + '
# | +PROSnap ID |
+PRO Snaphot | +PROInst ID |
+PRO Plan HV | +PROVers Cnt |
+PRO Execs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROProfile | +PRO
# | +PROSnap ID |
+PRO Snaphot | +PROInst ID |
+PRO Plan HV | +PROVers Cnt |
+PRO Execs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROProfile | +PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.snap_id||' | '||CHR(10)|| + ''||TO_CHAR(v.end_interval_time, 'YYYY-MM-DD/HH24:MI:SS')||' | '||CHR(10)|| + ''||v.instance_number||' | '||CHR(10)|| + ''||v.plan_hash_value||' | '||CHR(10)|| + ''||v.version_count||' | '||CHR(10)|| + ''||v.executions_total||' | '||CHR(10)|| + ''||v.fetches_total||' | '||CHR(10)|| + ''||v.loads_total||' | '||CHR(10)|| + ''||v.invalidations_total||' | '||CHR(10)|| + ''||v.parse_calls_total||' | '||CHR(10)|| + ''||v.buffer_gets_total||' | '||CHR(10)|| + ''||v.disk_reads_total||' | '||CHR(10)|| + ''||v.direct_writes_total||' | '||CHR(10)|| + ''||v.rows_processed_total||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.elapsed_time_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.cpu_time_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.iowait_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.ccwait_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.apwait_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.clwait_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.plsexec_time_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||TO_CHAR(ROUND(v.javexec_time_total / 1e6, 3), '99999999999990D990')||' | '||CHR(10)|| + ''||v.optimizer_mode||' | '||CHR(10)|| + ''||v.optimizer_cost||' | '||CHR(10)|| + ''||v.optimizer_env_hash_value||' | '||CHR(10)|| + ''||v.parsing_schema_name||' | '||CHR(10)|| + ''||v.module||' | '||CHR(10)|| + ''||v.action||' | '||CHR(10)|| + ''||v.sql_profile||' | '||CHR(10)|| + '
# | +PROSnap ID |
+PRO Snaphot | +PROInst ID |
+PRO Plan HV | +PROVers Cnt |
+PRO Execs | +PROFetch | +PROLoads | +PROInval | +PROParse Calls |
+PRO Buffer Gets |
+PRO Disk Reads |
+PRO Direct Writes |
+PRO Rows Proc |
+PRO Elapsed Time (secs) |
+PRO CPU Time (secs) |
+PRO IO Time (secs) |
+PRO Conc Time (secs) |
+PRO Appl Time (secs) |
+PRO Clus Time (secs) |
+PRO PLSQL Time (secs) |
+PRO Java Time (secs) |
+PRO Optimizer Mode |
+PRO Cost | +PROOpt Env HV | +PROParsing Schema Name |
+PRO Module | +PROAction | +PROProfile | +PRO
# | +PROPlan Hash Value |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROSnaps Count |
+PRO
---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.sql_plan_hash_value||' | '||CHR(10)|| + ''||v.session_state||' | '||CHR(10)|| + ''||v.wait_class||' | '||CHR(10)|| + ''||v.event||' | '||CHR(10)|| + ''||v.snaps_count||' | '||CHR(10)|| + '
# | +PROPlan Hash Value |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROSnaps Count |
+PRO
# | +PROPlan Hash Value |
+PRO Plan Line ID |
+PRO Plan Operation |
+PRO Plan Options |
+PRO Plan Object Owner |
+PRO Plan Object Name |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROCurr Obj ID |
+PRO Curr Object Name |
+PRO Snaps Count |
+PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.sql_plan_hash_value||' | '||CHR(10)|| + ''||v.sql_plan_line_id||' | '||CHR(10)|| + ''||v.sql_plan_operation||' | '||CHR(10)|| + ''||v.sql_plan_options||' | '||CHR(10)|| + ''||v.object_owner||' | '||CHR(10)|| + ''||v.object_name||' | '||CHR(10)|| + ''||v.session_state||' | '||CHR(10)|| + ''||v.wait_class||' | '||CHR(10)|| + ''||v.event||' | '||CHR(10)|| + ''||v.current_obj#||' | '||CHR(10)|| + ''||v.current_obj_name||' | '||CHR(10)|| + ''||v.snaps_count||' | '||CHR(10)|| + '
# | +PROPlan Hash Value |
+PRO Plan Line ID |
+PRO Plan Operation |
+PRO Plan Options |
+PRO Plan Object Owner |
+PRO Plan Object Name |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROCurr Obj ID |
+PRO Curr Object Name |
+PRO Snaps Count |
+PRO
# | +PROPlan Hash Value |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROSnaps Count |
+PRO
---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.sql_plan_hash_value||' | '||CHR(10)|| + ''||v.session_state||' | '||CHR(10)|| + ''||v.wait_class||' | '||CHR(10)|| + ''||v.event||' | '||CHR(10)|| + ''||v.snaps_count||' | '||CHR(10)|| + '
# | +PROPlan Hash Value |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROSnaps Count |
+PRO
# | +PROPlan Hash Value |
+PRO Plan Line ID |
+PRO Plan Operation |
+PRO Plan Options |
+PRO Plan Object Owner |
+PRO Plan Object Name |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROCurr Obj ID |
+PRO Curr Object Name |
+PRO Snaps Count |
+PRO
---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.sql_plan_hash_value||' | '||CHR(10)|| + ''||v.sql_plan_line_id||' | '||CHR(10)|| + ''||v.sql_plan_operation||' | '||CHR(10)|| + ''||v.sql_plan_options||' | '||CHR(10)|| + ''||v.object_owner||' | '||CHR(10)|| + ''||v.object_name||' | '||CHR(10)|| + ''||v.session_state||' | '||CHR(10)|| + ''||v.wait_class||' | '||CHR(10)|| + ''||v.event||' | '||CHR(10)|| + ''||v.current_obj#||' | '||CHR(10)|| + ''||v.current_obj_name||' | '||CHR(10)|| + ''||v.snaps_count||' | '||CHR(10)|| + '
# | +PROPlan Hash Value |
+PRO Plan Line ID |
+PRO Plan Operation |
+PRO Plan Options |
+PRO Plan Object Owner |
+PRO Plan Object Name |
+PRO Session State |
+PRO Wait Class |
+PRO Event | +PROCurr Obj ID |
+PRO Curr Object Name |
+PRO Snaps Count |
+PRO
# | +PROParameter Name | +PROParameter Value | +PRO||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.sname||' | '||CHR(10)|| + ''||v.spare4||' | '||CHR(10)|| + '||||||||||||||||||||||||
# | +PROPreference Name | +PROPreference Value | +PRO
# | +PROTable Name | +PROOwner | +PROPart | +PRODoP | +PROTemp | +PRONum Rows | +PROSample Size |
+PRO Perc | +PROLast Analyzed | +PROBlocks | +PROAvg Row Len |
+PRO Global Stats |
+PRO User Stats |
+PRO Stat Type Locked |
+PRO Stale Stats |
+PRO Perc | +PROTable Cols |
+PRO Indexes | +PROIndex Cols |
+PRO Stat Versions |
+PRO |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.table_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + CASE WHEN v.partitioned = 'YES' + THEN ''||v.partitioned||' | ' + ELSE ''||v.partitioned||' | ' + END||CHR(10)|| + ''||v.degree||' | '||CHR(10)|| + ''||v.temporary||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.blocks||' | '||CHR(10)|| + ''||v.avg_row_len||' | '||CHR(10)|| + ''||v.global_stats||' | '||CHR(10)|| + ''||v.user_stats||' | '||CHR(10)|| + ''||v.stattype_locked||' | '||CHR(10)|| + ''||v.stale_stats||' | '||CHR(10)|| + ''||v.stale_stats_perc||' | '||CHR(10)|| + ''||v.columns||' | '||CHR(10)|| + ''||v.indexes||' | '||CHR(10)|| + ''||v.index_columns||' | '||CHR(10)|| + 'Versions | '||CHR(10)|| + '
# | +PROTable Name | +PROOwner | +PROPart | +PRODoP | +PROTemp | +PRONum Rows | +PROSample Size |
+PRO Perc | +PROLast Analyzed | +PROBlocks | +PROAvg Row Len |
+PRO Global Stats |
+PRO User Stats |
+PRO Stat Type Locked |
+PRO Stale Stats |
+PRO Perc | +PROTable Cols |
+PRO Indexes | +PROIndex Cols |
+PRO Stat Versions |
+PRO
# | +PROOwner | +PROTable Name | +PROObj# | +PROParameter Name | +PROParameter Value | +PROChange Time | +PRO||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||o.object_owner||' | '||CHR(10)|| + ''||o.object_name||' | '||CHR(10)|| + ''||v.obj#||' | '||CHR(10)|| + ''||v.pname||' | '||CHR(10)|| + ''||v.valchar||' | '||CHR(10)|| + ''||v.chgtime||' | '||CHR(10)|| + '||||||||||||||||||||
# | +PROOwner | +PROTable Name | +PROObj# | +PROParameter Name | +PROParameter Value | +PROChange Time | +PRO
# | '||CHR(10)|| + --'Table Name | '||CHR(10)|| + --'Owner | '||CHR(10)|| + 'Indexes | '||CHR(10)|| + 'Col ID | '||CHR(10)||
+ 'Column Name | '||CHR(10)|| + 'Data Type | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Num Nulls | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Num Distinct | '||CHR(10)||
+ 'Low Value | '||CHR(10)|| + 'High Value | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Avg Col Len | '||CHR(10)||
+ 'Density | '||CHR(10)|| + 'Num Buckets | '||CHR(10)||
+ 'Histogram | '||CHR(10)|| + 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ '
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + --''||v.table_name||' | '||CHR(10)|| + --''||v.owner||' | '||CHR(10)|| + ''||v.indexes||' | '||CHR(10)|| + ''||v.column_id||' | '||CHR(10)|| + ''||v.column_name||' | '||CHR(10)|| + ''||v.data_type||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.num_nulls||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.num_distinct||' | '||CHR(10)|| + ''||v.low_value||' | '||CHR(10)|| + ''||v.high_value||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.avg_col_len||' | '||CHR(10)|| + ''||v.density||' | '||CHR(10)|| + ''||v.num_buckets||' | '||CHR(10)|| + ''||v.histogram||' | '||CHR(10)|| + ''||v.global_stats||' | '||CHR(10)|| + ''||v.user_stats||' | '||CHR(10)|| + '
# | '||CHR(10)|| + --'Table Name | '||CHR(10)|| + --'Owner | '||CHR(10)|| + 'Indexes | '||CHR(10)|| + 'Col ID | '||CHR(10)||
+ 'Column Name | '||CHR(10)|| + 'Data Type | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Num Nulls | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Num Distinct | '||CHR(10)||
+ 'Low Value | '||CHR(10)|| + 'High Value | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Avg Col Len | '||CHR(10)||
+ 'Density | '||CHR(10)|| + 'Num Buckets | '||CHR(10)||
+ 'Histogram | '||CHR(10)|| + 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ '
# | '||CHR(10)|| + 'Partition Position | '||CHR(10)||
+ 'Partition Name | '||CHR(10)||
+ 'Composite | '||CHR(10)|| + 'Subpartition Count | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Blocks | '||CHR(10)|| + 'Avg Row Len | '||CHR(10)||
+ 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ 'Staleness Perc | '||CHR(10)||
+ '
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.partition_position||' | '||CHR(10)|| + ''||v.partition_name||' | '||CHR(10)|| + ''||v.composite||' | '||CHR(10)|| + ''||v.subpartition_count||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.blocks||' | '||CHR(10)|| + ''||v.avg_row_len||' | '||CHR(10)|| + ''||v.global_stats||' | '||CHR(10)|| + ''||v.user_stats||' | '||CHR(10)|| + ''||v.staleness_perc||' | '||CHR(10)|| + '
# | '||CHR(10)|| + 'Partition Position | '||CHR(10)||
+ 'Partition Name | '||CHR(10)||
+ 'Composite | '||CHR(10)|| + 'Subpartition Count | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Blocks | '||CHR(10)|| + 'Avg Row Len | '||CHR(10)||
+ 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ 'Staleness Perc | '||CHR(10)||
+ '
# | '||CHR(10)|| + 'Constraint Name | '||CHR(10)||
+ 'Constraint Type | '||CHR(10)||
+ -- 'Search Condition | '||CHR(10)||
+ 'R Owner | '||CHR(10)|| + 'R Constraint Name | '||CHR(10)||
+ 'Delete Rule | '||CHR(10)||
+ 'Status | '||CHR(10)|| + 'Defferable | '||CHR(10)|| + 'Deferred | '||CHR(10)|| + 'Validated | '||CHR(10)|| + 'Generated | '||CHR(10)|| + 'Rely | '||CHR(10)|| + 'Last Change | '||CHR(10)||
+ 'Index Owner | '||CHR(10)||
+ 'Index Name | '||CHR(10)||
+ 'Invalid | '||CHR(10)|| + 'View Related | '||CHR(10)||
+ '
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.constraint_name||' | '||CHR(10)|| + ''||v.constraint_type||' | '||CHR(10)|| + -- ''||v.search_condition||' | '||CHR(10)|| + ''||v.r_owner||' | '||CHR(10)|| + ''||v.r_constraint_name||' | '||CHR(10)|| + ''||v.delete_rule||' | '||CHR(10)|| + ''||v.status||' | '||CHR(10)|| + ''||v.deferrable||' | '||CHR(10)|| + ''||v.deferred||' | '||CHR(10)|| + ''||v.validated||' | '||CHR(10)|| + ''||v.generated||' | '||CHR(10)|| + ''||v.rely||' | '||CHR(10)|| + ''||v.last_change||' | '||CHR(10)|| + ''||v.index_owner||' | '||CHR(10)|| + ''||v.index_name||' | '||CHR(10)|| + ''||v.invalid||' | '||CHR(10)|| + ''||v.view_related||' | '||CHR(10)|| + '
# | '||CHR(10)|| + 'Constraint Name | '||CHR(10)||
+ 'Constraint Type | '||CHR(10)||
+ -- 'Search Condition | '||CHR(10)||
+ 'R Owner | '||CHR(10)|| + 'R Constraint Name | '||CHR(10)||
+ 'Delete Rule | '||CHR(10)||
+ 'Status | '||CHR(10)|| + 'Defferable | '||CHR(10)|| + 'Deferred | '||CHR(10)|| + 'Validated | '||CHR(10)|| + 'Generated | '||CHR(10)|| + 'Rely | '||CHR(10)|| + 'Last Change | '||CHR(10)||
+ 'Index Owner | '||CHR(10)||
+ 'Index Name | '||CHR(10)||
+ 'Invalid | '||CHR(10)|| + 'View Related | '||CHR(10)||
+ '
# | +PROTable Name | +PROOwner | +PROVersion Type | +PROSave Time | +PROLast Analyzed | +PRONum Rows | +PROSample Size |
+PRO Perc | +PROBlocks | +PROAvg Row Len |
+PRO
---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.object_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + ''||v.version_type||' | '||CHR(10)|| + ''||v.savtime||' | '||CHR(10)|| + ''||v.analyzetime||' | '||CHR(10)|| + ''||v.rowcnt||' | '||CHR(10)|| + ''||v.samplesize||' | '||CHR(10)|| + ''||v.perc||' | '||CHR(10)|| + ''||v.blkcnt||' | '||CHR(10)|| + ''||v.avgrln||' | '||CHR(10)|| + '
# | +PROTable Name | +PROOwner | +PROVersion Type | +PROSave Time | +PROLast Analyzed | +PRONum Rows | +PROSample Size |
+PRO Perc | +PROBlocks | +PROAvg Row Len |
+PRO
# | '||CHR(10)|| + --'Table Name | '||CHR(10)|| + --'Owner | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Index Type | '||CHR(10)|| + 'Part | '||CHR(10)|| + 'DoP | '||CHR(10)|| + 'Temp | '||CHR(10)|| + 'Uniqueness | '||CHR(10)|| + 'Cols | '||CHR(10)|| + 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ 'Stat Type Locked | '||CHR(10)||
+ 'Stale Stats | '||CHR(10)||
+ 'Stats Versions | '||CHR(10)||
+ '|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + --''||v.table_name||' | '||CHR(10)|| + --''||v.table_owner||' | '||CHR(10)|| + ''||v.index_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + ''||v.index_type||' | '||CHR(10)|| + CASE WHEN v.partitioned = 'YES' + THEN ''||v.partitioned||' | ' + ELSE ''||v.partitioned||' | ' + END||CHR(10)|| + ''||v.degree||' | '||CHR(10)|| + ''||v.temporary||' | '||CHR(10)|| + ''||v.uniqueness||' | '||CHR(10)|| + ''||v.columns||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.distinct_keys||' | '||CHR(10)|| + ''||v.blevel||' | '||CHR(10)|| + ''||v.leaf_blocks||' | '||CHR(10)|| + ''||v.avg_leaf_blocks_per_key||' | '||CHR(10)|| + ''||v.avg_data_blocks_per_key||' | '||CHR(10)|| + ''||v.clustering_factor||' | '||CHR(10)|| + ''||v.global_stats||' | '||CHR(10)|| + ''||v.user_stats||' | '||CHR(10)|| + ''||v.stattype_locked||' | '||CHR(10)|| + ''||v.stale_stats||' | '||CHR(10)|| + 'Versions | '||CHR(10)|| + '
# | '||CHR(10)|| + --'Table Name | '||CHR(10)|| + --'Owner | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Index Type | '||CHR(10)|| + 'Part | '||CHR(10)|| + 'DoP | '||CHR(10)|| + 'Temp | '||CHR(10)|| + 'Uniqueness | '||CHR(10)|| + 'Cols | '||CHR(10)|| + 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ 'Global Stats | '||CHR(10)||
+ 'User Stats | '||CHR(10)||
+ 'Stat Type Locked | '||CHR(10)||
+ 'Stale Stats | '||CHR(10)||
+ 'Stats Versions | '||CHR(10)||
+ '
# | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Partition Position | '||CHR(10)||
+ 'Partition Name | '||CHR(10)||
+ 'Subpartition Count | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ '
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.index_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + ''||v.partition_position||' | '||CHR(10)|| + ''||v.partition_name||' | '||CHR(10)|| + ''||v.subpartition_count||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.distinct_keys||' | '||CHR(10)|| + ''||v.blevel||' | '||CHR(10)|| + ''||v.leaf_blocks||' | '||CHR(10)|| + ''||v.avg_leaf_blocks_per_key||' | '||CHR(10)|| + ''||v.avg_data_blocks_per_key||' | '||CHR(10)|| + ''||v.clustering_factor||' | '||CHR(10)|| + '
# | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Partition Position | '||CHR(10)||
+ 'Partition Name | '||CHR(10)||
+ 'Subpartition Count | '||CHR(10)||
+ 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ '
# | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Version Type | '||CHR(10)|| + 'Save Time | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ '
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.index_name||' | '||CHR(10)|| + ''||v.owner||' | '||CHR(10)|| + ''||v.version_type||' | '||CHR(10)|| + ''||v.save_time||' | '||CHR(10)|| + ''||v.last_analyzed||' | '||CHR(10)|| + ''||v.num_rows||' | '||CHR(10)|| + ''||v.sample_size||' | '||CHR(10)|| + ''||v.sample_size_perc||' | '||CHR(10)|| + ''||v.distinct_keys||' | '||CHR(10)|| + ''||v.blevel||' | '||CHR(10)|| + ''||v.leaf_blocks||' | '||CHR(10)|| + ''||v.avg_leaf_blocks_per_key||' | '||CHR(10)|| + ''||v.avg_data_blocks_per_key||' | '||CHR(10)|| + ''||v.clustering_factor||' | '||CHR(10)|| + '
# | '||CHR(10)|| + 'Index Name | '||CHR(10)|| + 'Owner | '||CHR(10)|| + 'Version Type | '||CHR(10)|| + 'Save Time | '||CHR(10)|| + 'Last Analyzed | '||CHR(10)|| + 'Num Rows | '||CHR(10)||
+ 'Sample Size | '||CHR(10)||
+ 'Perc | '||CHR(10)|| + 'Distinct Keys | '||CHR(10)||
+ 'Blevel | '||CHR(10)|| + 'Leaf Blocks | '||CHR(10)||
+ 'Avg Leaf Blocks per Key | '||CHR(10)||
+ 'Avg Data Blocks per Key | '||CHR(10)||
+ 'Clustering Factor | '||CHR(10)||
+ '
# | +PROName | +PROInst | +PROOrd | +PROIs Default |
+PRO Is Modified |
+PRO Value | +PRODisplay Value |
+PRO Description | +PRO
---|---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.name||' | '||CHR(10)|| + ''||v.inst_id||' | '||CHR(10)|| + ''||v.ordinal||' | '||CHR(10)|| + ''||v.isdefault||' | '||CHR(10)|| + ''||v.ismodified||' | '||CHR(10)|| + ''||v.value||' | '||CHR(10)|| + ''||DECODE(v.display_value, v.value, NULL, v.display_value)||' | '||CHR(10)|| + ''||v.description||' | '||CHR(10)|| + '
# | +PROName | +PROInst | +PROOrd | +PROIs Default |
+PRO Is Modified |
+PRO Value | +PRODisplay Value |
+PRO Description | +PRO
# | +PROName | +PROOrd | +PROIs Default |
+PRO Is Modified |
+PRO Value | +PRODisplay Value |
+PRO Description | +PRO
---|---|---|---|---|---|---|---|
'||ROWNUM||' | '||CHR(10)|| + ''||v.name||' | '||CHR(10)|| + ''||v.ordinal||' | '||CHR(10)|| + ''||v.isdefault||' | '||CHR(10)|| + ''||v.ismodified||' | '||CHR(10)|| + ''||v.value||' | '||CHR(10)|| + ''||DECODE(v.display_value, v.value, NULL, v.display_value)||' | '||CHR(10)|| + ''||v.description||' | '||CHR(10)|| + '
# | +PROName | +PROOrd | +PROIs Default |
+PRO Is Modified |
+PRO Value | +PRODisplay Value |
+PRO Description | +PRO
+PRO License : ^^input_license. +PRO Input : ^^input_parameter. +PRO SIGNATURE : ^^signature. +PRO SIGNATUREF : ^^signaturef. +PRO RDBMS : ^^rdbms_version. +PRO Platform : ^^platform. +PRO Database : ^^database_name_short. +PRO DBID : ^^dbid. +PRO Host : ^^host_name_short. +PRO Instance : ^^instance_number. +PRO CPU_Count : ^^sys_cpu. +PRO Num CPUs : ^^num_cpus. +PRO Num Cores : ^^num_cores. +PRO Num Sockets: ^^num_sockets. +PRO Block Size : ^^sys_db_block_size. +PRO OFE : ^^sys_ofe. +PRO DYN_SAMP : ^^sys_ds. +PRO EBS : "^^is_ebs." +PRO SIEBEL : "^^is_siebel." +PRO PSFT : "^^is_psft." +PRO Date : ^^time_stamp2. +PRO User : ^^sessionuser. +PRO+ +PRO
+ +DECLARE + l_sql_text CLOB := :sql_text; + l_pos NUMBER; +BEGIN + WHILE NVL(LENGTH(l_sql_text), 0) > 0 + LOOP + l_pos := INSTR(l_sql_text, CHR(10)); + IF l_pos > 0 THEN + DBMS_OUTPUT.PUT_LINE(SUBSTR(l_sql_text, 1, l_pos - 1)); + l_sql_text := SUBSTR(l_sql_text, l_pos + 1); + ELSE + DBMS_OUTPUT.PUT_LINE(l_sql_text); + l_sql_text := NULL; + END IF; + END LOOP; +END; +/ + +PRO+ +/* ------------------------- + * + * DBMS_XPLAN.DISPLAY_CURSOR OUTLINE ALLSTATS LAST + * + * ------------------------- */ +COL inst_child FOR A21; +BREAK ON inst_child SKIP 2; + +PRO
+ +SELECT RPAD('Inst: '||v.inst_id, 9)||' '||RPAD('Child: '||v.child_number, 11) inst_child, t.plan_table_output + FROM gv$sql 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 + WHERE v.sql_id = :sql_id + AND v.loaded_versions > 0; + +PRO+ +/* ------------------------- + * + * DBMS_XPLAN.DISPLAY_CURSOR OUTLINE ALLSTATS + * + * ------------------------- */ +PRO
+ +SELECT RPAD('Inst: '||v.inst_id, 9)||' '||RPAD('Child: '||v.child_number, 11) inst_child, t.plan_table_output + FROM gv$sql v, + TABLE(DBMS_XPLAN.DISPLAY('gv$sql_plan_statistics_all', NULL, 'ADVANCED ALLSTATS', 'inst_id = '||v.inst_id||' AND sql_id = '''||v.sql_id||''' AND child_number = '||v.child_number)) t + WHERE v.sql_id = :sql_id + AND v.loaded_versions > 0 + AND v.executions > 1; + +PRO+ +/* ------------------------- + * + * DBMS_XPLAN.DISPLAY_AWR OUTLINE + * + * ------------------------- */ +PRO
+ +SELECT t.plan_table_output + FROM (SELECT DISTINCT sql_id, plan_hash_value, dbid + FROM dba_hist_sql_plan WHERE :license IN ('T', 'D') AND dbid = ^^dbid. AND sql_id = :sql_id) v, + TABLE(DBMS_XPLAN.DISPLAY_AWR(v.sql_id, v.plan_hash_value, v.dbid, 'ADVANCED')) t; + +PRO+ +/* ------------------------- + * + * footer + * + * ------------------------- */ +PRO +SELECT '' FROM dual; +PRO