Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

db2系统定时runstats、reorg方法代码

Posted on 2008-08-14 19:18 Prayer 阅读(1450) 评论(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 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理