132 lines
2.9 KiB
SQL
132 lines
2.9 KiB
SQL
-- ============================================================================
|
|
-- awrsqlidtabstat2.sql
|
|
-- ----------------------------------------------------------------------------
|
|
-- Reference:
|
|
-- https://blogs.oracle.com/optimizer/post/check-sql-stale-statistics
|
|
-- Updated in 2026 july from Grand Canaria ;)
|
|
-- ============================================================================
|
|
|
|
SET PAGESIZE 100
|
|
SET LINESIZE 150
|
|
SET TRIMS OFF
|
|
SET TAB OFF
|
|
SET VERIFY OFF
|
|
|
|
COLUMN table_name FORMAT a25
|
|
COLUMN index_name FORMAT a25
|
|
COLUMN object_type FORMAT a20
|
|
COLUMN owner FORMAT a25
|
|
COLUMN object_owner FORMAT a25
|
|
COLUMN object_name FORMAT a25
|
|
COLUMN stale_stats FORMAT a30
|
|
COLUMN num_rows FORMAT 999,999,999,999
|
|
COLUMN visibility FORMAT a9
|
|
COLUMN status FORMAT a8
|
|
|
|
PROMPT
|
|
PROMPT ==================================
|
|
PROMPT Tables with Statistics Information
|
|
PROMPT ==================================
|
|
PROMPT
|
|
|
|
WITH plan_tables AS (
|
|
SELECT DISTINCT
|
|
object_name,
|
|
object_owner,
|
|
object_type
|
|
FROM dba_hist_sql_plan
|
|
WHERE object_type LIKE 'TABLE%'
|
|
AND sql_id = '&1'
|
|
AND plan_hash_value = '&2'
|
|
)
|
|
SELECT
|
|
t.object_owner AS owner,
|
|
t.object_name AS table_name,
|
|
t.object_type AS object_type,
|
|
tab.num_rows,
|
|
DECODE(
|
|
stale_stats,
|
|
'NO', 'OK',
|
|
NULL, 'NO STATS!',
|
|
'STALE!'
|
|
) AS staleness
|
|
FROM dba_tab_statistics s
|
|
JOIN plan_tables t
|
|
ON s.table_name = t.object_name
|
|
AND s.owner = t.object_owner
|
|
JOIN dba_tables tab
|
|
ON t.object_owner = tab.owner
|
|
AND t.object_name = tab.table_name
|
|
WHERE s.partition_name IS NULL
|
|
AND s.subpartition_name IS NULL
|
|
ORDER BY t.object_owner, t.object_name;
|
|
|
|
|
|
PROMPT
|
|
PROMPT ===================================
|
|
PROMPT Indexes with Statistics Information
|
|
PROMPT ===================================
|
|
PROMPT
|
|
|
|
WITH plan_indexes AS (
|
|
SELECT DISTINCT
|
|
object_name,
|
|
object_owner,
|
|
object_type
|
|
FROM dba_hist_sql_plan
|
|
WHERE object_type LIKE 'INDEX%'
|
|
AND sql_id = '&1'
|
|
AND plan_hash_value = '&2'
|
|
)
|
|
SELECT
|
|
i.object_owner AS owner,
|
|
i.object_name AS index_name,
|
|
i.object_type AS object_type,
|
|
idx.status,
|
|
idx.num_rows,
|
|
idx.visibility,
|
|
DECODE(
|
|
stale_stats,
|
|
'NO', 'OK',
|
|
NULL, 'NO STATS',
|
|
'STALE!'
|
|
) AS staleness
|
|
FROM dba_ind_statistics s
|
|
JOIN plan_indexes i
|
|
ON s.index_name = i.object_name
|
|
AND s.owner = i.object_owner
|
|
JOIN dba_indexes idx
|
|
ON s.owner = idx.owner
|
|
AND s.index_name = idx.index_name
|
|
WHERE s.partition_name IS NULL
|
|
AND s.subpartition_name IS NULL
|
|
ORDER BY i.object_owner, i.object_name;
|
|
|
|
|
|
PROMPT
|
|
PROMPT ===============
|
|
PROMPT Missing Indexes
|
|
PROMPT ===============
|
|
PROMPT
|
|
|
|
WITH plan_indexes AS (
|
|
SELECT DISTINCT
|
|
object_name,
|
|
object_owner,
|
|
object_type
|
|
FROM dba_hist_sql_plan
|
|
WHERE object_type LIKE 'INDEX%'
|
|
AND sql_id = '&1'
|
|
AND plan_hash_value = '&2'
|
|
)
|
|
SELECT
|
|
object_owner,
|
|
object_name
|
|
FROM plan_indexes
|
|
WHERE object_type = 'INDEX'
|
|
MINUS
|
|
SELECT
|
|
owner,
|
|
index_name
|
|
FROM dba_indexes;
|