188 lines
5.2 KiB
SQL
188 lines
5.2 KiB
SQL
----------------------------------------------------------------------------------------
|
|
--
|
|
-- File name: cs_dbms_stats_age.sql
|
|
--
|
|
-- Purpose: DBMS_STATS Age as per "auto optimizer stats collection"
|
|
--
|
|
-- Author: Carlos Sierra
|
|
--
|
|
-- Version: 2021/09/23
|
|
--
|
|
-- Usage: Execute connected to CDB or PDB.
|
|
--
|
|
-- Example: $ sqlplus / as sysdba
|
|
-- SQL> @cs_dbms_stats_age.sql
|
|
--
|
|
-- Notes: Developed and tested on 12.1.0.2.
|
|
--
|
|
---------------------------------------------------------------------------------------
|
|
--
|
|
@@cs_internal/cs_primary.sql
|
|
--@@cs_internal/cs_cdb_warn.sql
|
|
@@cs_internal/cs_set.sql
|
|
@@cs_internal/cs_def.sql
|
|
@@cs_internal/cs_file_prefix.sql
|
|
--
|
|
DEF cs_script_name = 'cs_dbms_stats_age';
|
|
--
|
|
SELECT '&&cs_file_prefix._&&cs_script_name.' cs_file_name FROM DUAL;
|
|
--
|
|
@@cs_internal/cs_spool_head.sql
|
|
PRO SQL> @&&cs_script_name..sql
|
|
@@cs_internal/cs_spool_id.sql
|
|
--
|
|
PRO
|
|
PRO Latest Window Start Time (dba_autotask_job_history)
|
|
PRO ~~~~~~~~~~~~~~~~~~~~~~~~
|
|
COL con_id FOR 999999;
|
|
COL pdb_name FOR A30 TRUNC;
|
|
COL window_name FOR A20;
|
|
COL window_start_time FOR A35;
|
|
COL window_duration FOR A30;
|
|
COL job_start_time FOR A35;
|
|
COL job_duration FOR A20;
|
|
COL job_info FOR A80;
|
|
--
|
|
WITH
|
|
hist AS (
|
|
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
|
|
con_id, window_name, window_start_time, window_duration, job_start_time, job_duration,
|
|
EXTRACT(DAY FROM (job_start_time - window_start_time) * 24 * 60) AS delay_mins,
|
|
ROW_NUMBER() OVER (PARTITION BY con_id ORDER BY window_start_time DESC) AS rn,
|
|
job_error, job_status, job_info
|
|
FROM cdb_autotask_job_history
|
|
WHERE client_name = 'auto optimizer stats collection'
|
|
)
|
|
SELECT '|' AS "|",
|
|
h.con_id, c.name AS pdb_name,
|
|
h.window_name, h.window_start_time, h.window_duration, h.job_start_time, h.job_duration, h.delay_mins,
|
|
h.job_error, h.job_status, h.job_info
|
|
FROM hist h, v$containers c
|
|
WHERE h.rn = 1
|
|
AND c.con_id = h.con_id
|
|
ORDER BY h.con_id, h.window_start_time
|
|
/
|
|
--
|
|
COL con_id FOR 9999990;
|
|
COL pdb_name FOR A30 TRUNC;
|
|
COL last_good_date FOR A19;
|
|
COL days FOR 9,990.00;
|
|
--
|
|
PRO
|
|
PRO DBMS_STATS AGE (dba_autotask_task)
|
|
PRO ~~~~~~~~~~~~~~
|
|
WITH
|
|
last_exec AS (
|
|
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
|
|
t.con_id,
|
|
CAST(t.last_good_date AS DATE) AS last_good_date
|
|
FROM cdb_autotask_task t
|
|
WHERE t.client_name = 'auto optimizer stats collection'
|
|
)
|
|
SELECT '|' AS "|",
|
|
e.con_id, c.name AS pdb_name,
|
|
TO_CHAR(e.last_good_date, 'YYYY-MM-DD"T"HH24:MI:SS') AS last_good_date,
|
|
ROUND(SYSDATE - e.last_good_date, 2) AS days
|
|
FROM last_exec e, v$containers c
|
|
WHERE c.con_id = e.con_id
|
|
ORDER BY
|
|
e.con_id
|
|
/
|
|
--
|
|
COL con_id FOR 999990;
|
|
COL pdb_name FOR A30 TRUNC;
|
|
COL tables FOR 99,990;
|
|
COL days1 FOR 9,990.00;
|
|
COL days2 FOR 9,990.00;
|
|
COL max_last_analyzed FOR A19;
|
|
COL p90th_percentile FOR A19;
|
|
--
|
|
PRO
|
|
PRO DBMS_STATS AGE (dba_tables)
|
|
PRO ~~~~~~~~~~~~~~
|
|
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
|
|
'|' AS "|",
|
|
t.con_id,
|
|
c.name AS pdb_name,
|
|
MAX(t.last_analyzed) AS max_last_analyzed,
|
|
ROUND(SYSDATE - MAX(t.last_analyzed), 2) AS days1,
|
|
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC) AS p90th_percentile,
|
|
ROUND(SYSDATE - PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC), 2) AS days2,
|
|
COUNT(*) AS tables
|
|
FROM cdb_tables t, cdb_users u, v$containers c
|
|
WHERE t.con_id <> 2
|
|
AND u.con_id = t.con_id
|
|
AND u.username = t.owner
|
|
AND u.oracle_maintained = 'N'
|
|
AND u.common = 'NO'
|
|
AND c.con_id = t.con_id
|
|
GROUP BY
|
|
t.con_id, c.name
|
|
ORDER BY
|
|
t.con_id, c.name
|
|
/
|
|
--
|
|
COL con_id FOR 9999990;
|
|
COL pdb_name FOR A30 TRUNC;
|
|
COL last_good_date FOR A19;
|
|
COL days FOR 9,990.00;
|
|
COL tables FOR 99,990;
|
|
COL days1 FOR 9,990.00;
|
|
COL days2 FOR 9,990.00;
|
|
COL max_last_analyzed FOR A19;
|
|
COL p90th_percentile FOR A19;
|
|
PRO
|
|
PRO DBMS_STATS AGE (dba_autotask_task and dba_tables)
|
|
PRO ~~~~~~~~~~~~~~
|
|
WITH
|
|
autotask_task AS (
|
|
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
|
|
t.con_id,
|
|
TO_CHAR(t.last_good_date, 'YYYY-MM-DD"T"HH24:MI:SS') AS last_good_date,
|
|
ROUND(SYSDATE - CAST(t.last_good_date AS DATE), 2) AS days
|
|
FROM cdb_autotask_task t
|
|
WHERE t.client_name = 'auto optimizer stats collection'
|
|
),
|
|
tables AS (
|
|
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
|
|
t.con_id,
|
|
MAX(t.last_analyzed) AS max_last_analyzed,
|
|
ROUND(SYSDATE - MAX(t.last_analyzed), 2) AS days1,
|
|
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC) AS p90th_percentile,
|
|
ROUND(SYSDATE - PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC), 2) AS days2,
|
|
COUNT(*) AS tables
|
|
FROM cdb_tables t, cdb_users u
|
|
WHERE t.con_id <> 2
|
|
AND u.con_id = t.con_id
|
|
AND u.username = t.owner
|
|
AND u.oracle_maintained = 'N'
|
|
AND u.common = 'NO'
|
|
GROUP BY
|
|
t.con_id
|
|
)
|
|
SELECT '|' AS "|",
|
|
a.con_id,
|
|
c.name AS pdb_name,
|
|
a.last_good_date,
|
|
a.days,
|
|
'|' AS "|",
|
|
t.max_last_analyzed,
|
|
t.days1,
|
|
t.p90th_percentile,
|
|
t.days2,
|
|
t.tables
|
|
FROM autotask_task a, tables t, v$containers c
|
|
WHERE t.con_id = a.con_id
|
|
AND c.con_id = a.con_id
|
|
ORDER BY
|
|
a.con_id
|
|
/
|
|
--
|
|
PRO
|
|
PRO SQL> @&&cs_script_name..sql
|
|
--
|
|
@@cs_internal/cs_spool_tail.sql
|
|
@@cs_internal/cs_undef.sql
|
|
@@cs_internal/cs_reset.sql
|
|
--
|