分区索引碎片整理Script

本文介绍了一种通过查询sys和system用户的视图来评估Oracle数据库中索引的效率,并提供了具体的SQL语句来创建和更新一张用于监测索引状态的表。通过执行这些步骤,可以有效地识别出需要进行优化的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步、在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里去执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值