Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a0d8086

Browse files
committed
v1715
1 parent 8fa475d commit a0d8086

13 files changed

Lines changed: 690 additions & 22 deletions

sql/dc.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
SET LIN 300 PAGES 0 VER OFF FEED OFF ECHO OFF;
2+
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&&sql_id.', NULL, 'ADVANCED ALLSTATS LAST'));

sql/fs.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
DEF sql_id = '';
2+
COL sql_id NEW_V sql_id;
3+
SELECT sql_id, SUBSTR(sql_text, 1, 100) sql_text_100
4+
FROM v$sql
5+
WHERE sql_text LIKE '%&sql_text_piece%'
6+
AND sql_text NOT LIKE '%sql_id%'
7+
/

sql/indexes_2b_shrunk.sql

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
----------------------------------------------------------------------------------------
2+
--
3+
-- File name: indexes_2b_shrunk.sql
4+
--
5+
-- Purpose: List of candidate indexes to be shrunk (rebuild online), if:
6+
-- 1. they are larger than a certain MB threshold; and
7+
-- 2. space savings is larger than a certain % threshold
8+
--
9+
-- Author: Carlos Sierra
10+
--
11+
-- Version: 2017/07/20
12+
--
13+
-- Usage: Execute on PDB
14+
--
15+
-- Example: @indexes_2b_shrunk.sql
16+
--
17+
-- Notes: Execute connected into a PDB.
18+
-- Consider then:
19+
-- ALTER INDEX [schema.]index REBUILD ONLINE;
20+
--
21+
---------------------------------------------------------------------------------------
22+
23+
-- select only those indexes with an estimated space saving percent greater than 25%
24+
VAR savings_percent NUMBER;
25+
EXEC :savings_percent := 25;
26+
-- select only those indexes with current size (as per cbo stats) greater then 10MB
27+
VAR minimum_size_mb NUMBER;
28+
EXEC :minimum_size_mb := 10;
29+
30+
SET SERVEROUT ON ECHO OFF FEED OFF VER OFF TAB OFF LINES 300;
31+
32+
COL report_date NEW_V report_date;
33+
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD"T"HH24-MI-SS') report_date FROM DUAL;
34+
SPO /tmp/indexes_2b_shrunk_&&report_date..txt;
35+
36+
DECLARE
37+
l_used_bytes NUMBER;
38+
l_alloc_bytes NUMBER;
39+
l_percent NUMBER;
40+
BEGIN
41+
DBMS_OUTPUT.PUT_LINE('PDB: '||SYS_CONTEXT('USERENV', 'CON_NAME'));
42+
DBMS_OUTPUT.PUT_LINE('---');
43+
DBMS_OUTPUT.PUT_LINE(
44+
RPAD('TABLE_NAME', 30)||' '||
45+
RPAD('OWNER.INDEX_NAME', 35)||' '||
46+
LPAD('SAVING %', 10)||' '||
47+
LPAD('CURRENT SIZE', 20)||' '||
48+
LPAD('ESTIMATED SIZE', 20)||' '||
49+
RPAD('COMMAND', 75));
50+
DBMS_OUTPUT.PUT_LINE(
51+
RPAD('-', 30, '-')||' '||
52+
RPAD('-', 35, '-')||' '||
53+
LPAD('-', 10, '-')||' '||
54+
LPAD('-', 20, '-')||' '||
55+
LPAD('-', 20, '-')||' '||
56+
RPAD('-', 75, '-'));
57+
FOR i IN (SELECT x.table_name, x.owner, x.index_name, SUM(s.leaf_blocks) * TO_NUMBER(p.value) index_size,
58+
REPLACE(DBMS_METADATA.GET_DDL('INDEX',x.index_name,x.owner),CHR(10),CHR(32)) ddl
59+
FROM dba_ind_statistics s, dba_indexes x, dba_users u, v$parameter p
60+
WHERE u.oracle_maintained = 'N'
61+
AND x.owner = u.username
62+
AND x.tablespace_name NOT IN ('SYSTEM','SYSAUX')
63+
AND x.index_type LIKE '%NORMAL%'
64+
AND x.table_type = 'TABLE'
65+
AND x.status = 'VALID'
66+
AND x.temporary = 'N'
67+
AND x.dropped = 'NO'
68+
AND x.visibility = 'VISIBLE'
69+
AND x.segment_created = 'YES'
70+
AND x.orphaned_entries = 'NO'
71+
AND p.name = 'db_block_size'
72+
AND s.owner = x.owner
73+
AND s.index_name = x.index_name
74+
GROUP BY
75+
x.table_name, x.owner, x.index_name, p.value
76+
HAVING
77+
SUM(s.leaf_blocks) * TO_NUMBER(p.value) > :minimum_size_mb * POWER(2,20)
78+
ORDER BY
79+
index_size DESC)
80+
LOOP
81+
DBMS_SPACE.CREATE_INDEX_COST(i.ddl,l_used_bytes,l_alloc_bytes);
82+
IF i.index_size * (100 - :savings_percent) / 100 > l_alloc_bytes THEN
83+
l_percent := 100 * (i.index_size - l_alloc_bytes) / i.index_size;
84+
DBMS_OUTPUT.PUT_LINE(
85+
RPAD(i.table_name, 30)||' '||
86+
RPAD(i.owner||'.'||i.index_name, 35)||' '||
87+
LPAD(TO_CHAR(ROUND(l_percent, 1), '990.0')||' % ', 10)||' '||
88+
LPAD(TO_CHAR(ROUND(i.index_size / POWER(2,20), 1), '999,999,990.0')||' MB', 20)||' '||
89+
LPAD(TO_CHAR(ROUND(l_alloc_bytes / POWER(2,20), 1), '999,999,990.0')||' MB', 20)||' '||
90+
RPAD('ALTER INDEX '||LOWER(i.owner||'.'||i.index_name)||' REBUILD ONLINE;', 75));
91+
END IF;
92+
END LOOP;
93+
END;
94+
/
95+
96+
SPO OFF;
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
----------------------------------------------------------------------------------------
2+
--
3+
-- File name: indexes_2b_shrunk_fast_full_scan.sql
4+
--
5+
-- *** Requires Oracle Diagnostics Pack License ***
6+
--
7+
-- Purpose: List of candidate indexes to be shrunk (rebuild online), if:
8+
-- 1. they are larger than a certain MB threshold; and
9+
-- 2. space savings is larger than a certain % threshold; and
10+
-- 3. they have been recently referenced by an index full scan operation
11+
--
12+
-- Author: Carlos Sierra
13+
--
14+
-- Version: 2017/07/14
15+
--
16+
-- Usage: Execute on PDB
17+
--
18+
-- Example: @indexes_2b_shrunk_fast_full_scan.sql
19+
--
20+
-- Notes: Execute connected into a PDB.
21+
-- Consider then:
22+
-- ALTER INDEX [schema.]index REBUILD ONLINE;
23+
--
24+
-- *** Requires Oracle Diagnostics Pack License ***
25+
--
26+
---------------------------------------------------------------------------------------
27+
28+
-- select only those indexes with current size (as per cbo stats) greater than 10MB
29+
VAR minimum_size_mb NUMBER;
30+
EXEC :minimum_size_mb := 10;
31+
-- select only those indexes with an estimated space saving percent greater than 25%
32+
VAR savings_percent NUMBER;
33+
EXEC :savings_percent := 25;
34+
-- select only those indexes if recently referenced by an INDEX FULL SCAN operation
35+
VAR only_if_on_recent_full_scans CHAR(1);
36+
EXEC :only_if_on_recent_full_scans := 'Y';
37+
-- have Oracle Diagnostics Pack License
38+
VAR diagnostics_pack_license CHAR(1);
39+
EXEC :diagnostics_pack_license := 'Y';
40+
41+
SET SERVEROUT ON ECHO OFF FEED OFF VER OFF TAB OFF LINES 300;
42+
43+
COL report_date NEW_V report_date;
44+
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD"T"HH24-MI-SS') report_date FROM DUAL;
45+
SPO /tmp/indexes_2b_shrunk_fast_full_scan_&&report_date..txt;
46+
47+
DECLARE
48+
l_used_bytes NUMBER;
49+
l_alloc_bytes NUMBER;
50+
l_percent NUMBER;
51+
BEGIN
52+
DBMS_OUTPUT.PUT_LINE('PDB: '||SYS_CONTEXT('USERENV', 'CON_NAME'));
53+
DBMS_OUTPUT.PUT_LINE('---');
54+
DBMS_OUTPUT.PUT_LINE(
55+
RPAD('TABLE_NAME', 30)||' '||
56+
RPAD('OWNER.INDEX_NAME', 35)||' '||
57+
LPAD('SAVING %', 10)||' '||
58+
LPAD('CURRENT SIZE', 20)||' '||
59+
LPAD('ESTIMATED SIZE', 20)||' '||
60+
RPAD('COMMAND', 75));
61+
DBMS_OUTPUT.PUT_LINE(
62+
RPAD('-', 30, '-')||' '||
63+
RPAD('-', 35, '-')||' '||
64+
LPAD('-', 10, '-')||' '||
65+
LPAD('-', 20, '-')||' '||
66+
LPAD('-', 20, '-')||' '||
67+
RPAD('-', 75, '-'));
68+
FOR i IN (WITH
69+
candidates_as_per_stats AS (
70+
SELECT /*+ MATERIALIZE NO_MERGE */
71+
x.table_name, x.owner, x.index_name,
72+
SUM(s.leaf_blocks) * TO_NUMBER(p.value) index_size
73+
FROM dba_ind_statistics s, dba_indexes x, dba_users u, v$parameter p
74+
WHERE u.oracle_maintained = 'N'
75+
AND x.owner = u.username
76+
AND x.tablespace_name NOT IN ('SYSTEM','SYSAUX')
77+
AND x.index_type LIKE '%NORMAL%'
78+
AND x.table_type = 'TABLE'
79+
AND x.status = 'VALID'
80+
AND x.temporary = 'N'
81+
AND x.dropped = 'NO'
82+
AND x.visibility = 'VISIBLE'
83+
AND x.segment_created = 'YES'
84+
AND x.orphaned_entries = 'NO'
85+
AND p.name = 'db_block_size'
86+
AND s.owner = x.owner
87+
AND s.index_name = x.index_name
88+
GROUP BY
89+
x.table_name, x.owner, x.index_name, p.value
90+
HAVING
91+
SUM(s.leaf_blocks) * TO_NUMBER(p.value) > :minimum_size_mb * POWER(2,20)
92+
),
93+
snap AS (
94+
SELECT /*+ MATERIALIZE NO_MERGE */
95+
dbid, MIN(snap_id) min_snap_id
96+
FROM dba_hist_snapshot
97+
WHERE :diagnostics_pack_license = 'Y'
98+
AND :only_if_on_recent_full_scans = 'Y'
99+
AND dbid = (SELECT dbid FROM v$database)
100+
AND end_interval_time > SYSDATE - 7 /* only last 7 days */
101+
GROUP BY
102+
dbid
103+
),
104+
awr_plans AS (
105+
SELECT /*+ MATERIALIZE NO_MERGE */
106+
UNIQUE hist.dbid, hist.sql_id, hist.plan_hash_value
107+
FROM snap, dba_hist_sqlstat hist
108+
WHERE :diagnostics_pack_license = 'Y'
109+
AND :only_if_on_recent_full_scans = 'Y'
110+
AND hist.dbid = snap.dbid
111+
AND hist.snap_id >= snap.min_snap_id
112+
),
113+
referenced_by_fast_full_scan AS (
114+
SELECT /*+ MATERIALIZE NO_MERGE */
115+
object_owner, object_name
116+
FROM v$sql_plan
117+
WHERE :only_if_on_recent_full_scans = 'Y'
118+
AND operation = 'INDEX'
119+
AND options IN ('FULL SCAN', 'FAST FULL SCAN', 'SAMPLE FAST FULL SCAN')
120+
AND object_owner <> 'SYS'
121+
GROUP BY
122+
object_owner, object_name
123+
UNION
124+
SELECT /*+ MATERIALIZE NO_MERGE */
125+
p.object_owner, p.object_name
126+
FROM awr_plans h, dba_hist_sql_plan p
127+
WHERE :diagnostics_pack_license = 'Y'
128+
AND :only_if_on_recent_full_scans = 'Y'
129+
AND p.dbid = h.dbid
130+
AND p.sql_id = h.sql_id
131+
AND p.plan_hash_value = h.plan_hash_value
132+
AND p.operation = 'INDEX'
133+
AND p.options IN ('FULL SCAN', 'FAST FULL SCAN', 'SAMPLE FAST FULL SCAN')
134+
AND p.object_owner <> 'SYS'
135+
GROUP BY
136+
p.object_owner, p.object_name
137+
)
138+
SELECT c.table_name, c.owner, c.index_name, c.index_size,
139+
REPLACE(DBMS_METADATA.GET_DDL('INDEX',c.index_name,c.owner),CHR(10),CHR(32)) index_ddl
140+
FROM candidates_as_per_stats c
141+
WHERE :only_if_on_recent_full_scans <> 'Y'
142+
OR (c.owner, c.index_name) IN (SELECT r.object_owner, r.object_name FROM referenced_by_fast_full_scan r)
143+
ORDER BY
144+
c.index_size DESC)
145+
LOOP
146+
DBMS_SPACE.CREATE_INDEX_COST(i.index_ddl,l_used_bytes,l_alloc_bytes);
147+
IF i.index_size * (100 - :savings_percent) / 100 > l_alloc_bytes THEN
148+
l_percent := 100 * (i.index_size - l_alloc_bytes) / i.index_size;
149+
DBMS_OUTPUT.PUT_LINE(
150+
RPAD(i.table_name, 30)||' '||
151+
RPAD(i.owner||'.'||i.index_name, 35)||' '||
152+
LPAD(TO_CHAR(ROUND(l_percent, 1), '990.0')||' % ', 10)||' '||
153+
LPAD(TO_CHAR(ROUND(i.index_size / POWER(2,20), 1), '999,999,990.0')||' MB', 20)||' '||
154+
LPAD(TO_CHAR(ROUND(l_alloc_bytes / POWER(2,20), 1), '999,999,990.0')||' MB', 20)||' '||
155+
RPAD('ALTER INDEX '||LOWER(i.owner||'.'||i.index_name)||' REBUILD ONLINE;', 75));
156+
END IF;
157+
END LOOP;
158+
END;
159+
/
160+
161+
SPO OFF;

0 commit comments

Comments
 (0)