a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 102|回复: 0

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的。. K3 o' w/ b7 N
它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小。* _0 X' q3 R, w
在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放。. j! V4 v; j/ m4 @' \: Y8 y/ i
重建索引可以释放已删除记录索引占用的数据块空间。2 A4 s7 R5 [1 l  G0 n4 g$ n7 E4 [
转移数据, 重命名的方法可以重新组织表里的数据。
1 T; i0 _4 [6 M/ u& U0 \) r下面是可以按ORACLE用户名生成重建索引的SQL脚本:
# C# U8 i6 Q" e5 _7 x# K3 eSET ECHO OFF;
3 x, B5 K  F4 M% ?SET FEEDBACK OFF;: K- u/ s, K- \; G/ b( [* ?
SET VERIFY OFF;( z7 g1 p5 Z+ @  i0 ?" B  k* m
SET PAGESIZE 0;
) Y3 \6 \+ P0 zSET TERMOUT ON;8 Q4 Q) j1 A$ r
SET HEADING OFF;; a: h# R( a5 R
ACCEPT username CHAR PROMPT 'Enter the index username: ';
3 z, @7 W5 G) }" g6 Y  z; Ospool /oracle/rebuild_&username.sql;
: b2 `* [* L6 Z, D( oSELECT
* G; f" a  O9 `" |, m'REM +-----------------------------------------------+' || chr(10) ||
" F* U" E2 w1 R  W8 e'REM | INDEX NAME : ' || owner || '.' || segment_name! u1 U) _9 F4 Q, v3 D/ Q6 T
|| lpad('|', 33 - (length(owner) + length(segment_name)) )
7 o9 J. K: z& W$ D& _1 I|| chr(10) ||
4 Y1 n: F; a2 Q- Y* k'REM | BYTES : ' || bytes9 z4 m: D$ j/ }
|| lpad ('|', 34-(length(bytes)) ) || chr(10) ||# H# c% j+ D4 g% @, g. ?- W
'REM | EXTENTS : ' || extents# J8 m3 q' i/ G- n4 p  H% v# @# \
|| lpad ('|', 34-(length(extents)) ) || chr(10) ||% F" ?9 |/ x/ r6 {! D% y4 Q1 P' j9 C/ s
'REM +-----------------------------------------------+' || chr(10) ||
  B/ F8 s8 W. O  l; Y* T7 H'ALTER INDEX ' || owner || '.' || segment_name || chr(10) ||
" i, ^% c) u8 j9 F: n2 e'REBUILD ' || chr(10) ||4 H. K- b5 S9 o5 Z
'TABLESPACE ' || tablespace_name || chr(10) ||( L, r6 E: _0 {4 c) f$ Y0 X7 \
'STORAGE ( ' || chr(10) ||9 M% C. [# ?' G% s! n
' INITIAL ' || initial_extent || chr(10) ||
# f6 G/ ?/ D: d' NEXT ' || next_extent || chr(10) ||
4 v2 T7 D( W* b% s: _6 H' q' MINEXTENTS ' || min_extents || chr(10) ||' w1 K3 A; Y/ a; C: c
' MAXEXTENTS ' || max_extents || chr(10) ||5 P. _1 R% X( n, o2 g' z. K. _9 L6 k5 z6 |
' PCTINCREASE ' || pct_increase || chr(10) ||& m, t* z$ i: ]$ i' q) Q* M
');' || chr(10) || chr(10)1 q$ u1 }7 x& w, j3 D
FROM dba_segments
' _5 `8 ^: |8 R/ HWHERE segment_type = 'INDEX'
# `1 }/ B7 ~% H5 S8 f6 x" sAND owner='&username'( z; E0 ]6 A" h9 i" Y- ~
ORDER BY owner, bytes DESC;
6 y' x: `% \& }- z5 Jspool off;  e& `* v: _# c/ f; h- T7 _; `
如果你用的是WINDOWS系统, 想改变输出文件的存放目录,修改spool后面的路径成:
) C: n6 p9 B- d9 l1 F6 t( Vspool c:\oracle\rebuild_&username.sql;
* y3 }5 h, t1 h. ^& ?! R; z4 A如果你只想对大于max_bytes的索引重建索引,可以修改上面的SQL语句:
( F# ^4 F: o  M" h8 B在AND owner='&username' 后面加个限制条件 AND bytes> &max_bytes$ ^" C, s: U5 b- g8 c6 @  b
如果你想修改索引的存储参数, 在重建索引rebuild_&username.sql里改也可以。
+ ^* p( N; g0 f. O$ G5 @比如把pctincrease不等于零的值改成是零。! I+ I$ Z" L% T8 Z
生成的rebuild_&username.sql文件我们需要来分析一下,它们是否到了需要重建的程度:
& ^, z+ B: B2 V0 n! ^分析索引,看是否碎片严重) x4 _/ z/ g' E) G' j3 B; ]
SQL>ANALYZE INDEX &index_name VALIDATE STRUCTURE;# v+ M5 e& x4 E% c; y
col name heading 'Index Name' format a30
9 {! ?$ y' x: b5 g- O$ v% [col del_lf_rows heading 'Deleted|Leaf Rows' format 99999999
' S. P1 d3 ]( T, ycol lf_rows_used heading 'Used|Leaf Rows' format 99999999# t2 p. P0 a; a4 e2 f
col ratio heading '% Deleted|Leaf Rows' format 999.99999
( I, b4 Y0 U- v; D2 N9 \- SSELECT name,
3 F( e0 n/ o0 S/ h+ h4 M: cdel_lf_rows,( [5 f: G" }+ @% F
lf_rows - del_lf_rows lf_rows_used,
) d- D- \2 o; B" H. Kto_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio; G! h* y- @+ I$ |$ r! ~% t! D
FROM index_stats where name = upper('&index_name');
6 r8 S9 L0 w# |: B* H当删除的比率大于15 - 20% 时,肯定是需要索引重建的。% W, o5 ?* i' _; L; _9 M  Y9 k
经过删改后的rebuild_&username.sql文件我们可以放到ORACLE的定时作业里:
/ y+ U) i% q$ ~# a( v6 [1 c* e比如一个月或者两个月在非繁忙时间运行。
2 z/ d. ~9 s' E) k9 J2 f如果遇到ORA-00054错误,表示索引在的表上有锁信息,不能重建索引。- X8 a" W6 l. r4 F- l& L
那就忽略这个错误, 看下次是否成功。
+ e0 j- }( Q$ g5 L7 V对那些特别忙的表要区别对待, 不能用这里介绍的方法,
) x5 |! l8 y( Z还要把它们的索引从rebuild_&username.sql里删去。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 06:30 , Processed in 0.311110 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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