a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 90|回复: 0

[考试辅导] 如何在Oracle数据库中按用户名重建索引

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的。9 U& v2 C1 y4 ]& y/ ]& x
它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小。) U% C7 O& d2 H) N( a2 E9 c
在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放。
# N4 O" b# h* \% k3 [重建索引可以释放已删除记录索引占用的数据块空间。- z' k* i0 l: K4 O4 v
转移数据, 重命名的方法可以重新组织表里的数据。! l; v5 ~* n' X
下面是可以按ORACLE用户名生成重建索引的SQL脚本:
2 p0 Q- C' A7 R7 e9 s2 LSET ECHO OFF;+ x2 l' e  ?/ Y/ x: v# f- }
SET FEEDBACK OFF;- Z/ ~9 j# w+ e3 P( \+ @9 X; m, a
SET VERIFY OFF;
: l5 b4 I6 ]' MSET PAGESIZE 0;
* p4 U: N. C$ s7 ]! w& n1 TSET TERMOUT ON;. T0 C% W  t  }. z: T1 e8 q( k
SET HEADING OFF;6 q. A( p* R8 G  f9 d& H
ACCEPT username CHAR PROMPT 'Enter the index username: ';  {8 H; g- p" u
spool /oracle/rebuild_&username.sql;
" x* i8 a' [$ G+ r9 W5 ~SELECT
+ @9 G6 |, O0 P0 U9 t'REM +-----------------------------------------------+' || chr(10) ||
4 X0 u# u3 |# p'REM | INDEX NAME : ' || owner || '.' || segment_name( ?1 L8 F5 e# Y8 A/ d  }
|| lpad('|', 33 - (length(owner) + length(segment_name)) )
$ H, Q1 Y4 ~+ |  }2 X5 X|| chr(10) ||  x! G# P9 Q6 B% z+ }: u
'REM | BYTES : ' || bytes! [8 R+ O  ]9 ^8 \, b
|| lpad ('|', 34-(length(bytes)) ) || chr(10) ||& x1 V- @7 N9 u# q
'REM | EXTENTS : ' || extents
& S8 o. }& h( h5 x$ }|| lpad ('|', 34-(length(extents)) ) || chr(10) ||
9 ~4 P( x" [' c4 C7 o- A" P'REM +-----------------------------------------------+' || chr(10) ||
+ O7 i: ]' I7 Q7 [0 f* E5 z'ALTER INDEX ' || owner || '.' || segment_name || chr(10) ||( Y% U3 ?8 b  f# q4 B" ~' O
'REBUILD ' || chr(10) ||' L: \- t% k4 @0 l( n" D6 L. d6 E  r$ O
'TABLESPACE ' || tablespace_name || chr(10) ||! Q, J! y9 `2 i0 X4 q8 l
'STORAGE ( ' || chr(10) ||
. Q) l" S% Y/ c# m% f' INITIAL ' || initial_extent || chr(10) ||
7 j0 U/ B/ r  k/ k6 w$ i" S' NEXT ' || next_extent || chr(10) ||7 M9 y, Q4 B2 ]4 L
' MINEXTENTS ' || min_extents || chr(10) ||* j6 l$ f, C; n1 Y9 G1 J# S
' MAXEXTENTS ' || max_extents || chr(10) ||
2 }5 a7 t# [, k' ~# f' PCTINCREASE ' || pct_increase || chr(10) ||5 _8 T5 r6 I# @
');' || chr(10) || chr(10)
; o  \  X/ M0 ~6 y- ~, ?* m- VFROM dba_segments
- P9 H8 n* i  i* ^9 R  H. \WHERE segment_type = 'INDEX'
! T' {( _2 V# i4 L. sAND owner='&username'
2 T: y& R. ~/ M' nORDER BY owner, bytes DESC;  j7 A( h  V4 y1 e% j
spool off;
% U  D. N9 M& T* w* E如果你用的是WINDOWS系统, 想改变输出文件的存放目录,修改spool后面的路径成:: P4 Z6 M# T. J; ]
spool c:\oracle\rebuild_&username.sql;4 R; U/ E8 f) E! e3 U
如果你只想对大于max_bytes的索引重建索引,可以修改上面的SQL语句:
  ?+ x8 x4 @7 G8 P# t$ U- H6 a在AND owner='&username' 后面加个限制条件 AND bytes> &max_bytes) V3 \9 P7 G+ S8 {" y! j$ }
如果你想修改索引的存储参数, 在重建索引rebuild_&username.sql里改也可以。" ^& l  c. d9 T$ E$ W
比如把pctincrease不等于零的值改成是零。
: x- n& A/ T6 z* x9 {. ]3 j( T生成的rebuild_&username.sql文件我们需要来分析一下,它们是否到了需要重建的程度:, }* R( c- _& w" D2 @  Y3 s
分析索引,看是否碎片严重
0 t0 Y! L* p" aSQL>ANALYZE INDEX &index_name VALIDATE STRUCTURE;' `1 v$ O2 c5 P
col name heading 'Index Name' format a308 I5 Q& d" v7 G) }
col del_lf_rows heading 'Deleted|Leaf Rows' format 999999992 q* s: |- V. X+ E- e  F7 t/ x
col lf_rows_used heading 'Used|Leaf Rows' format 99999999
' m0 _6 G+ A: }col ratio heading '% Deleted|Leaf Rows' format 999.99999
$ Z& N. p* g+ `( A! }  O0 nSELECT name,- R. {  \0 u+ e  ~. J( r  Q
del_lf_rows,
3 j5 P+ W! `& `0 o$ @lf_rows - del_lf_rows lf_rows_used,2 ^2 R- e2 H6 I9 G
to_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio
; f4 L! n6 X# k- cFROM index_stats where name = upper('&index_name');9 y1 |8 i% b  h$ P) I
当删除的比率大于15 - 20% 时,肯定是需要索引重建的。* ]( R7 l& B( R7 y% M3 E
经过删改后的rebuild_&username.sql文件我们可以放到ORACLE的定时作业里:& a' G+ M: u# }0 U9 z- s
比如一个月或者两个月在非繁忙时间运行。; ~' m+ ]% D9 i1 r$ t
如果遇到ORA-00054错误,表示索引在的表上有锁信息,不能重建索引。
0 M; Y4 o- T7 }! e' [$ T7 U1 Z( X那就忽略这个错误, 看下次是否成功。
7 R% X5 {& l6 c6 o* Y8 t! l1 B对那些特别忙的表要区别对待, 不能用这里介绍的方法,
  E# f4 i# k! M7 [' O7 Z4 c还要把它们的索引从rebuild_&username.sql里删去。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 20:58 , Processed in 0.269608 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表