Files
oracle/tpt/ast/index_coalesce_candidate.sql

101 lines
3.2 KiB
MySQL
Raw Permalink Normal View History

2026-03-12 21:23:47 +01:00
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SET LINES 1000 PAGES 5000 TRIMSPOOL ON TRIMOUT ON TAB OFF
COL owner FOR A15
COL object_name FOR A30
WITH trends AS (
SELECT
o.owner
, o.object_name
, o.subobject_name
, o.object_type
, MIN(ih.savtime) first_sample
, MAX(ih.savtime) last_sample
, REGR_SLOPE(ih.rowcnt / NULLIF(ih.leafcnt,0), (SYSDATE-CAST(ih.savtime AS DATE)) ) regr1
, REGR_SLOPE(ih.rowcnt, ih.leafcnt) regr2
, ROUND(MIN(ih.rowcnt / NULLIF(ih.leafcnt,0))) min_avg_rows_per_block
, ROUND(MAX(ih.rowcnt / NULLIF(ih.leafcnt,0))) max_avg_rows_per_block
, MIN(ih.rowcnt) min_rowcnt
, MAX(ih.rowcnt) max_rowcnt
, MIN(ih.leafcnt) min_leafcnt
, MAX(ih.leafcnt) max_leafcnt
, MIN(ih.lblkkey) min_lblkkey
, MAX(ih.lblkkey) max_lblkkey
, MIN(ih.dblkkey) min_dblkkey
, MAX(ih.dblkkey) max_dblkkey
, MIN(ih.blevel)+1 min_height
, MAX(ih.blevel)+1 max_height
FROM
dba_objects o
, sys.wri$_optstat_ind_history ih
WHERE
o.object_id = ih.obj#
AND o.object_type LIKE 'INDEX%'
AND (
UPPER(o.object_name) LIKE
UPPER(CASE
WHEN INSTR('&1','.') > 0 THEN
SUBSTR('&1',INSTR('&1','.')+1)
ELSE
'&1'
END
)
AND UPPER(o.owner) LIKE
CASE WHEN INSTR('&1','.') > 0 THEN
UPPER(SUBSTR('&1',1,INSTR('&1','.')-1))
ELSE
user
END
)
GROUP BY
o.owner
, o.object_name
, o.subobject_name
, o.object_type
ORDER BY
-- ih.savtime
regr1 DESC NULLS LAST
)
SELECT * FROM (
SELECT
t.owner
, t.object_name
, t.subobject_name partition_name
, t.object_type
, ROUND(s.bytes / 1048576) current_mb
, CAST(first_sample AS DATE) first_sample
, CAST(last_sample AS DATE) last_sample
, min_avg_rows_per_block
, max_avg_rows_per_block
, min_leafcnt
, max_leafcnt
, min_lblkkey
, max_lblkkey
, min_dblkkey
, max_dblkkey
, t.regr1
, t.regr2
--, ROUND(SUM(s.bytes) / 1048576) mb_sum
--, COUNT(*)
FROM
trends t
, dba_segments s
WHERE
t.owner = s.owner
AND t.object_name = s.segment_name
AND t.object_type = s.segment_type
AND (t.subobject_name = s.partition_name OR (t.subobject_name IS NULL AND s.partition_name IS NULL))
--GROUP BY
-- t.owner
-- , t.object_name
-- , t.object_type
-- , t.subobject_name
ORDER BY regr1 DESC NULLS LAST
)
WHERE
ROWNUM<=20
/