各位用户为了找寻关于Oracle重建索引Shell脚本、SQL脚本分享的资料费劲了很多周折。这里教程网为您整理了关于Oracle重建索引Shell脚本、SQL脚本分享的相关资料,仅供查阅,以下为您介绍关于Oracle重建索引Shell脚本、SQL脚本分享的详细内容
索引是提高数据库查询性能的有力武器。没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难。然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应变化,因此可以对这些变化较大的索引进行重构以提高性能。N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引。但Oracle现在强烈建议不要定期重建索引。具体可以参考文章:Oracle 重建索引的必要性。尽管如此重建索引还是有必要的,只是不建议定期。本文给出了重建索引的脚本供大家参考。
1、重建索引shell脚本
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54robin@SZDB:~
/dba_scripts/custom/bin
>
more
rebuild_unbalanced_indices.sh
# +-------------------------------------------------------+
# + Rebulid unblanced indices |
# + Author : Leshami |
# + Parameter : No |
# +-------------------------------------------------------+
#!/bin/bash
# --------------------
# Define variable
# --------------------
if
[ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
DT=`
date
+%Y%m%d`;
export
DT
RETENTION=1
LOG_DIR=
/tmp
LOG=${LOG_DIR}
/rebuild_unbalanced_indices_
${DT}.log
DBA=Leshami@12306.cn
# ------------------------------------
# Loop all instance in current server
# -------------------------------------
echo
"Current date and time is : `/bin/date`"
>>${LOG}
for
db
in
`
ps
-ef |
grep
pmon |
grep
-
v
grep
|
grep
-
v
asm |
awk
'{print $8}'
|
cut
-c 10-`
do
echo
"$db"
export
ORACLE_SID=$db
echo
"Current DB is $db"
>>${LOG}
echo
"==============================================="
>>${LOG}
$ORACLE_HOME
/bin/sqlplus
-S
/nolog
@
/users/robin/dba_scripts/custom/sql/rebuild_unbalanced_indices
.sql>>${LOG}
done
;
echo
"End of rebuilding index for all instance at : `/bin/date`"
>>${LOG}
# -------------------------------------
# Check log file
# -------------------------------------
status=`
grep
"ORA-"
${LOG}`
if
[ -z $status ];
then
mail -s
"Succeeded rebuilding indices on `hostname` !!!"
${DBA} <${LOG}
else
mail -s
"Failed rebuilding indices on `hostname` !!!"
${DBA} <${LOG}
fi
# ------------------------------------------------
# Removing files older than $RETENTION parameter
# ------------------------------------------------
find
${LOG_DIR} -name
"rebuild_unb*"
-mtime +$RETENTION -
exec
rm
{} ;
exit
2、重建索引调用的SQL脚本
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176robin@SZDB:~/dba_scripts/custom/sql> more rebuild_unbalanced_indices.sql
conn /
as
sysdba
set
serveroutput
on
;
DECLARE
resource_busy EXCEPTION;
PRAGMA EXCEPTION_INIT (resource_busy, -54);
c_max_trial CONSTANT PLS_INTEGER := 10;
c_trial_interval CONSTANT PLS_INTEGER := 1;
pmaxheight CONSTANT
INTEGER
:= 3;
pmaxleafsdeleted CONSTANT
INTEGER
:= 20;
CURSOR
csrindexstats
IS
SELECT
NAME
,
height,
lf_rows
AS
leafrows,
del_lf_rows
AS
leafrowsdeleted
FROM
index_stats;
vindexstats csrindexstats%ROWTYPE;
CURSOR
csrglobalindexes
IS
SELECT
owner,index_name, tablespace_name
FROM
dba_indexes
WHERE
partitioned =
'NO'
AND
owner
IN
(
'GX_ADMIN'
);
CURSOR
csrlocalindexes
IS
SELECT
index_owner,index_name, partition_name, tablespace_name
FROM
dba_ind_partitions
WHERE
status =
'USABLE'
AND
index_owner
IN
(
'GX_ADMIN'
);
trial PLS_INTEGER;
vcount
INTEGER
:= 0;
BEGIN
trial := 0;
/*
Global
indexes */
FOR
vindexrec
IN
csrglobalindexes
LOOP
EXECUTE
IMMEDIATE
'analyze index '
|| vindexrec.owner ||
'.'
|| vindexrec.index_name ||
' validate structure'
;
OPEN
csrindexstats;
FETCH
csrindexstats
INTO
vindexstats;
IF csrindexstats%FOUND
THEN
IF (vindexstats.height > pmaxheight)
OR
( vindexstats.leafrows > 0
AND
vindexstats.leafrowsdeleted > 0
AND
(vindexstats.leafrowsdeleted * 100 / vindexstats.leafrows) >
pmaxleafsdeleted)
THEN
vcount := vcount + 1;
DBMS_OUTPUT.PUT_LINE (
'Rebuilding index '
|| vindexrec.owner ||
'.'
|| vindexrec.index_name ||
'...'
);
<<alter_index>>
BEGIN
EXECUTE
IMMEDIATE
'alter index '
|| vindexrec.owner ||
'.'
|| vindexrec.index_name
||
' rebuild'
||
' parallel nologging compute statistics'
||
' tablespace '
|| vindexrec.tablespace_name;
EXCEPTION
WHEN
resource_busy
OR
TIMEOUT_ON_RESOURCE
THEN
DBMS_OUTPUT.PUT_LINE (
'alter index - busy and wait for 1 sec'
);
DBMS_LOCK.sleep (c_trial_interval);
IF trial <= c_max_trial
THEN
GOTO
alter_index;
ELSE
DBMS_OUTPUT.PUT_LINE (
'alter index busy and waited - quit after '
|| TO_CHAR (c_max_trial)
||
' trials'
);
RAISE;
END
IF;
WHEN
OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (
'alter index err '
|| SQLERRM);
RAISE;
END
;
END
IF;
END
IF;
CLOSE
csrindexstats;
END
LOOP;
DBMS_OUTPUT.PUT_LINE (
'Global indices rebuilt: '
|| TO_CHAR (vcount));
vcount := 0;
trial := 0;
/*
Local
indexes */
FOR
vindexrec
IN
csrlocalindexes
LOOP
EXECUTE
IMMEDIATE
'analyze index '
|| vindexrec.index_owner||
'.'
|| vindexrec.index_name
||
' partition ('
|| vindexrec.partition_name
||
') validate structure'
;
OPEN
csrindexstats;
FETCH
csrindexstats
INTO
vindexstats;
IF csrindexstats%FOUND
THEN
IF (vindexstats.height > pmaxheight)
OR
( vindexstats.leafrows > 0
AND
vindexstats.leafrowsdeleted > 0
AND
(vindexstats.leafrowsdeleted * 100 / vindexstats.leafrows) >
pmaxleafsdeleted)
THEN
vcount := vcount + 1;
DBMS_OUTPUT.PUT_LINE (
'Rebuilding index '
|| vindexrec.index_owner||
'.'
|| vindexrec.index_name ||
'...'
);
<<alter_partitioned_index>>
BEGIN
EXECUTE
IMMEDIATE
'alter index '
|| vindexrec.index_owner||
'.'
|| vindexrec.index_name
||
' rebuild'
||
' partition '
|| vindexrec.partition_name
||
' parallel nologging compute statistics'
||
' tablespace '
|| vindexrec.tablespace_name;
EXCEPTION
WHEN
resource_busy
OR
TIMEOUT_ON_RESOURCE
THEN
DBMS_OUTPUT.PUT_LINE (
'alter partitioned index - busy and wait for 1 sec'
);
DBMS_LOCK.sleep (c_trial_interval);
IF trial <= c_max_trial
THEN
GOTO
alter_partitioned_index;
ELSE
DBMS_OUTPUT.PUT_LINE (
'alter partitioned index busy and waited - quit after '
|| TO_CHAR (c_max_trial)
||
' trials'
);
RAISE;
END
IF;
WHEN
OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (
'alter partitioned index err '
|| SQLERRM);
RAISE;
END
;
END
IF;
END
IF;
CLOSE
csrindexstats;
END
LOOP;
DBMS_OUTPUT.PUT_LINE (
'Local indices rebuilt: '
|| TO_CHAR (vcount));
END
;
/
exit;
3、输入日志样本
? 1 2 3 4 5 6 7 8Current date and time is : Sun Apr 20 02:00:02 HKT 2014
Current DB is SYBO2 ===============================================
Rebuilding index GX_ADMIN.SYN_OUT_DATA_TBL_PK...
Rebuilding index GX_ADMIN.IDX_TDBK_SPLNK_PARENT_REF...
Rebuilding index GX_ADMIN.IDX_TDBK_SPLNK_CHILD_REF...
Rebuilding index GX_ADMIN.PK_TRADE_BROKER_TBL...
Rebuilding index GX_ADMIN.IDX_TDBK_INPUT_DATE...
................
4、后记
a、如果同一台服务器上有多个实例,且每个实例有相同的schema,此脚本会轮巡所有实例并根据analyze结果来rebuild。 a、大家应根据需要作相应调整,如脚本的路径信息等。 b、需要修改相应的schema name。 d、可根据系统环境调整相应的并行度。