第一步、在sys、system用户下执行查询语句并插入到自己创建的表里
create table monitor.test
SELECT /*ORACONF*/ /*+ ordered */
u.name,
o.name index_name,
o.subname partition_name,
i.blevel,
to_char(100 * (1 - floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt) * (SUM(h.avgcln) + 10) /
((p.value - 66 -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans) * 24) *
(1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$) / 100))) /
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt)),
'999.00') || '%' density,
floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt) * (SUM(h.avgcln) + 10) /
((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans) * 24) *
(1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$) / 100))) extra_blocks,
MAX(o.mtime) last_ddl_time,
decode(MAX(nvl(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.analyzetime,
ip.obj#,
ip.analyzetime,
i.analyzetime),
to_date('01.01.1900', 'dd.mm.yyyy'))),
to_date('01.01.1900', 'dd.mm.yyyy'),
'not analyzed',
MAX(nvl(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.analyzetime,
ip.obj#,
ip.analyzetime,
i.analyzetime),
to_date('01.01.1900', 'dd.mm.yyyy')))) last_analyzed,
MAX(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
'N/A',
ip.obj#,
decode(bitand(ip.flags, 1024),
0,
'DISABLED',
1024,
'ENABLED',
'N/A'),
decode(bitand(i.flags, 32), 0, 'DISABLED', 32, 'ENABLED', 'N/A'))) compression
FROM sys.ind$ i,
sys.icol$ ic,
(SELECT obj#,
part#,
bo#,
ts#,
rowcnt,
leafcnt,
initrans,
pctfree$,
analyzetime,
flags
FROM sys.indpart$
UNION ALL
SELECT /*ORACONF*/
obj#,
part#,
bo#,
defts#,
rowcnt,
leafcnt,
definitrans,
defpctfree,
analyzetime,
flags
FROM sys.indcompart$) ip,
sys.indsubpart$ isp,
(SELECT ts#, blocksize VALUE FROM sys.ts$) p,
sys.hist_head$ h,
sys.obj$ o,
sys.user$ u,
sys.obj$ op
WHERE i.obj# = ip.bo#(+)
AND ip.obj# = isp.pobj#(+)
AND decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) > 1
AND i.type# IN (1)
AND -- exclude special types
i.pctthres$ IS NULL
AND -- exclude IOT secondary indexes
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.ts#,
ip.obj#,
ip.ts#,
i.ts#) = p.ts#
AND ic.obj# = i.obj#
AND h.obj# = i.bo#
AND h.intcol# = ic.intcol#
AND o.obj# = nvl(isp.obj#, nvl(ip.obj#, i.obj#))
AND o.owner# NOT IN (SELECT USER#
FROM sys.user$
WHERE NAME IN ('ANONYMOUS',
'AURORA$',
'AURORA',
'CTXSYS',
'DBSNMP',
'DIP',
'DMSYS',
'DVF',
'DVSYS',
'EXFSYS',
'HR',
'LBACSYS',
'MDDATA',
'MDSYS',
'MGMT_VIEW',
'ODM',
'ODM_MTR',
'OE',
'OLAPSYS',
'ORACLE_OCM',
'ORAWSM',
'ORDPLUGINS',
'ORDSYS',
'OSE',
'OUTLN',
'PERFSTAT',
'PM',
'QS',
'QS_ADM',
'QS_CB',
'QS_CBADM',
'QS_CS',
'QS_ES',
'QS_OS',
'QS_WS',
'REPADMIN',
'SCOTT',
'SH',
'SI_INFORMTN_SCHEMA',
'SYS',
'SYSMAN',
'SYSTEM',
'TRACESVR',
'TSMSYS',
'WKPROXY',
'WKSYS',
'WK_TEST',
'WKUSER',
'WMSYS',
'XDB'))
AND u.user# = o.owner#
AND op.obj# = nvl(ip.obj#, i.obj#)
GROUP BY u.name,
o.name,
o.subname,
i.blevel,
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$),
p.value
HAVING 100 * (1 - floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt) - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.rowcnt, ip.obj#, ip.rowcnt, i.rowcnt) * (SUM(h.avgcln) + 10) / ((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.initrans, ip.obj#, ip.initrans, i.initrans) * 24) * (1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.pctfree$, ip.obj#, ip.pctfree$, i.pctfree$) / 100))) / decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt)) <= nvl('75', '75') AND floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt) - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.rowcnt, ip.obj#, ip.rowcnt, i.rowcnt) * (SUM(h.avgcln) + 10) / ((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.initrans, ip.obj#, ip.initrans, i.initrans) * 24) * (1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.pctfree$, ip.obj#, ip.pctfree$, i.pctfree$) / 100))) > 0
ORDER BY 6 DESC, 5;
第二步、向monitor.test表添加相关标识字段并插入信息
alter table monitor.test add bytes NUMBER;
alter table monitor.test add segment_type varchar2(50);
alter table monitor.test add tablespace_name varchar2(50);
Merge into monitor.test m
using dba_segments a
on (a.owner= m.name and a.segment_name = m.index_name and nvl(a.partition_name,'NULL_ORG')=nvl(m.partition_name,'NULL_ORG') )
when matched then
update set m.segment_type = a.segment_type,
m.tablespace_name = a.tablespace_name,
m.bytes = a.BYTES;
第三步、生成执行脚本,这里注意选择前一个月分区之前的信息
update SPARSE_INDEX_20140627 set density=replace(density, '%','')
select ' alter index '||name||'.'||index_name||' rebuild '
||case when a.segment_type = 'INDEX PARTITION' then ' PARTITION ' when a.segment_type= 'INDEX SUBPARTITION' then ' SUBPARTITION ' else '' end
||partition_name||' online tablespace '||a.tablespace_name||';', a.partition_name, a.density,a.bytes/1024/1024 "MB"
from test a
where a.density < 50
and a.partition_name <= 'PAR_2014_05'
order by a.partition_name, a.density
第四步、将脚本放到shell里去执行
create table monitor.test
SELECT /*ORACONF*/ /*+ ordered */
u.name,
o.name index_name,
o.subname partition_name,
i.blevel,
to_char(100 * (1 - floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt) * (SUM(h.avgcln) + 10) /
((p.value - 66 -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans) * 24) *
(1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$) / 100))) /
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt)),
'999.00') || '%' density,
floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) -
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt) * (SUM(h.avgcln) + 10) /
((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans) * 24) *
(1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$) / 100))) extra_blocks,
MAX(o.mtime) last_ddl_time,
decode(MAX(nvl(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.analyzetime,
ip.obj#,
ip.analyzetime,
i.analyzetime),
to_date('01.01.1900', 'dd.mm.yyyy'))),
to_date('01.01.1900', 'dd.mm.yyyy'),
'not analyzed',
MAX(nvl(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.analyzetime,
ip.obj#,
ip.analyzetime,
i.analyzetime),
to_date('01.01.1900', 'dd.mm.yyyy')))) last_analyzed,
MAX(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
'N/A',
ip.obj#,
decode(bitand(ip.flags, 1024),
0,
'DISABLED',
1024,
'ENABLED',
'N/A'),
decode(bitand(i.flags, 32), 0, 'DISABLED', 32, 'ENABLED', 'N/A'))) compression
FROM sys.ind$ i,
sys.icol$ ic,
(SELECT obj#,
part#,
bo#,
ts#,
rowcnt,
leafcnt,
initrans,
pctfree$,
analyzetime,
flags
FROM sys.indpart$
UNION ALL
SELECT /*ORACONF*/
obj#,
part#,
bo#,
defts#,
rowcnt,
leafcnt,
definitrans,
defpctfree,
analyzetime,
flags
FROM sys.indcompart$) ip,
sys.indsubpart$ isp,
(SELECT ts#, blocksize VALUE FROM sys.ts$) p,
sys.hist_head$ h,
sys.obj$ o,
sys.user$ u,
sys.obj$ op
WHERE i.obj# = ip.bo#(+)
AND ip.obj# = isp.pobj#(+)
AND decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt) > 1
AND i.type# IN (1)
AND -- exclude special types
i.pctthres$ IS NULL
AND -- exclude IOT secondary indexes
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.ts#,
ip.obj#,
ip.ts#,
i.ts#) = p.ts#
AND ic.obj# = i.obj#
AND h.obj# = i.bo#
AND h.intcol# = ic.intcol#
AND o.obj# = nvl(isp.obj#, nvl(ip.obj#, i.obj#))
AND o.owner# NOT IN (SELECT USER#
FROM sys.user$
WHERE NAME IN ('ANONYMOUS',
'AURORA$',
'AURORA',
'CTXSYS',
'DBSNMP',
'DIP',
'DMSYS',
'DVF',
'DVSYS',
'EXFSYS',
'HR',
'LBACSYS',
'MDDATA',
'MDSYS',
'MGMT_VIEW',
'ODM',
'ODM_MTR',
'OE',
'OLAPSYS',
'ORACLE_OCM',
'ORAWSM',
'ORDPLUGINS',
'ORDSYS',
'OSE',
'OUTLN',
'PERFSTAT',
'PM',
'QS',
'QS_ADM',
'QS_CB',
'QS_CBADM',
'QS_CS',
'QS_ES',
'QS_OS',
'QS_WS',
'REPADMIN',
'SCOTT',
'SH',
'SI_INFORMTN_SCHEMA',
'SYS',
'SYSMAN',
'SYSTEM',
'TRACESVR',
'TSMSYS',
'WKPROXY',
'WKSYS',
'WK_TEST',
'WKUSER',
'WMSYS',
'XDB'))
AND u.user# = o.owner#
AND op.obj# = nvl(ip.obj#, i.obj#)
GROUP BY u.name,
o.name,
o.subname,
i.blevel,
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.rowcnt,
ip.obj#,
ip.rowcnt,
i.rowcnt),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.leafcnt,
ip.obj#,
ip.leafcnt,
i.leafcnt),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.initrans,
ip.obj#,
ip.initrans,
i.initrans),
decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)),
isp.obj#,
isp.pctfree$,
ip.obj#,
ip.pctfree$,
i.pctfree$),
p.value
HAVING 100 * (1 - floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt) - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.rowcnt, ip.obj#, ip.rowcnt, i.rowcnt) * (SUM(h.avgcln) + 10) / ((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.initrans, ip.obj#, ip.initrans, i.initrans) * 24) * (1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.pctfree$, ip.obj#, ip.pctfree$, i.pctfree$) / 100))) / decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt)) <= nvl('75', '75') AND floor(decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.leafcnt, ip.obj#, ip.leafcnt, i.leafcnt) - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.rowcnt, ip.obj#, ip.rowcnt, i.rowcnt) * (SUM(h.avgcln) + 10) / ((p.value - 66 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.initrans, ip.obj#, ip.initrans, i.initrans) * 24) * (1 - decode(nvl(isp.obj#, nvl(ip.obj#, i.obj#)), isp.obj#, isp.pctfree$, ip.obj#, ip.pctfree$, i.pctfree$) / 100))) > 0
ORDER BY 6 DESC, 5;
第二步、向monitor.test表添加相关标识字段并插入信息
alter table monitor.test add bytes NUMBER;
alter table monitor.test add segment_type varchar2(50);
alter table monitor.test add tablespace_name varchar2(50);
Merge into monitor.test m
using dba_segments a
on (a.owner= m.name and a.segment_name = m.index_name and nvl(a.partition_name,'NULL_ORG')=nvl(m.partition_name,'NULL_ORG') )
when matched then
update set m.segment_type = a.segment_type,
m.tablespace_name = a.tablespace_name,
m.bytes = a.BYTES;
第三步、生成执行脚本,这里注意选择前一个月分区之前的信息
update SPARSE_INDEX_20140627 set density=replace(density, '%','')
select ' alter index '||name||'.'||index_name||' rebuild '
||case when a.segment_type = 'INDEX PARTITION' then ' PARTITION ' when a.segment_type= 'INDEX SUBPARTITION' then ' SUBPARTITION ' else '' end
||partition_name||' online tablespace '||a.tablespace_name||';', a.partition_name, a.density,a.bytes/1024/1024 "MB"
from test a
where a.density < 50
and a.partition_name <= 'PAR_2014_05'
order by a.partition_name, a.density
第四步、将脚本放到shell里去执行