Posted on 2008-08-14 19:18
Prayer 閱讀(1459)
評論(0) 編輯 收藏 引用 所屬分類:
數據庫,SQL
Q:定期runstats、reorg
A:在db2 v8.2以上可以使用 CALL SYSPROC.ADMIN_CMD來實現,
這里主要講在v8.2以前的版本中利用shell或者批處理來實現同樣的功能
因為在以前的版本中存儲過程中是不能使用DDL操作語句的!(這點對于oracle剛轉過來的人來說很是郁悶的)
然后可以利用db2自帶的配置自動維護來做,但是java做的東西比較讓人感覺頭痛!尤其是速度和莫名的錯誤!
本代碼使用操作系統的腳本來實現這部分功能!
1.windows下
如下:
下一個cmd文件s.cmd
內容如下:
db2 connect to ccp_dm
db2 -x "select ’runstats on table ’||rtrim(tabschema)||’.’||tabname||’ on all columns’ from sysstat.tables where card=-1">tab.sql
db2 -f tab.sql
--其中where后的條件可以修改
然后就是定制任務:用windos的定制任務!每周或者每月運行,這個就不講了哈!
這部分經測試,通過!
不過能,這里只提到了runstats,對于reorg同理也可以實現!
2.非windows下(這個是從網上搞得,沒有測試過):
#!/usr/bin/ksh
#DB2V8統計更新腳本 by Ray001 2006/09/06
if [ $# -ne 3 ]
then
echo "Usage:$0 DBNAME USER PASSWD!"
exit 1
fi
DBNAME=$1
USER=$2
PASSWD=$3
rm -f tab.tmp
rm -f ind.tmp
db2 connect to $DBNAME user $USER using $PASSWD
db2 -x "select tabschema,tabname from sysstat.tables where card=-1">tab.tmp
if [ $? -ne 0 ]
then
if [ ! -s tab.tmp ]
then
echo "NO TABLES NEED TO BE PROCESS"
#exit 0
else
echo "SELECT SYSSTAT.TABLES ERROR"
exit 1
fi
fi
db2 -x "select tabschema,tabname,indschema,indname from sysstat.indexes where nl
eaf=-1">ind.tmp
if [ $? -ne 0 ]
then
if [ ! -s ind.tmp ]
then
echo "NO INDEXES NEED TO BE PROCESS"
#exit 0
else
echo "SELECT SYSSTAT.INDEXES ERROR"
exit 1
fi
fi
while read TABSCHEMA TABNAME
do
echo "runstats on table $TABSCHEMA.$TABNAME"
db2 "runstats on table $TABSCHEMA.$TABNAME"
donewhile read TABSCHEMA TABNAME INDSCHEMA INDNAME
do
echo "runstats on table $TABSCHEMA.$TABNAME for index $INDSCHEMA.$INDNAME"
db2 "runstats on table $TABSCHEMA.$TABNAME for index $INDSCHEMA.$INDNAME"
donedb2 terminate
rm -f tab.tmp
rm -f ind.tmp