设为首页 收藏本站
查看: 1559|回复: 0

[经验分享] 快速找出DB2分区键设置不正确的表

[复制链接]

尚未签到

发表于 2016-11-16 10:04:57 | 显示全部楼层 |阅读模式
  DB2建立表的时候可以设置一个分区键,默认的情况下都是根据建表者自己的开发经验来决定。如果万一分区键没有设置正确,就会造成数据库节点数据分配不均匀。那么如何快速的找出哪些表的分区键设置不正确呢??
自己写了一个不足130行的小程序就可以解决这个问题了
//~---non-JDKimports--------------------------------------------------------

importorg.apache.commons.beanutils.DynaBean;
importorg.apache.commons.beanutils.RowSetDynaClass;

//~---JDKimports------------------------------------------------------------

importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.List;

publicclassMain{
privatestaticString
url
="jdbc:db2://:/",
username
="hndp",
password
="hndp";

privatestaticRowSetDynaClassgetResultSet(Stringsql){
Connectionconn
=null;
Statementstaem
=null;
ResultSetrs
=null;
RowSetDynaClassrsdc
=null;

try{
Class.forName(
"com.ibm.db2.jcc.DB2Driver");
conn
=DriverManager.getConnection(url,username,password);
staem
=conn.createStatement();
rs
=staem.executeQuery(sql);
rsdc
=newRowSetDynaClass(rs);
}
catch(Exceptione){
e.printStackTrace();
}
finally{
try{
if(rs!=null){
rs.close();
}
if(staem!=null){
staem.close();
}
if(conn!=null){
conn.close();
}
}
catch(SQLExceptione){
e.printStackTrace();
}
}

returnrsdc;
}

publicstaticvoidmain(String[]args){
if(args.length<5){
System.out.println(
"参数少了!==》java Main10.154.144.4050000DBNAMEuserpassschema%");

return;
}

url
="jdbc:db2://"+args[0]+":"+args[1]+"/"+args[2];
username
=args[3];
password
=args[4];

StringSQL_QUERY_TABLE_NAME
=
"selectRTRIM(CREATOR)asschema,RTRIM(NAME)astablenamefromSYSIBM.SYSTABLESwhereTYPE='T'andCREATOR='"
+args[5]+"'ANDNAMElike'"+args[6]+"'WITHUR";
StringSQL_T
=
"select'#TALBE#'ASTABLENAME,A.PARTION,A.ROWS,B.ROWS_COUNT,A.ROWS*1.0/B.ROWS_COUNT,DEC(A.ROWS*1.0/B.ROWS_COUNT,4,2)aspersonfrom"
+"(selectCOUNT(*)ASROWS,dbpartitionnum(#KEY#)ASPARTION"+"FROM"+"#TALBE#"
+"GROUPBYdbpartitionnum(#KEY#)"+")ASA,"+"("+"selectCOUNT(*)ASROWS_COUNT"+"FROM"
+"#TALBE#"+")ASb";
StringSQL_TIAOJIAN
=
"selectTABLENAME,MIN(PERSON)ASMIN,MAX(PERSON)ASMAX,MAX(PERSON)-MIN(PERSON)ASCHAfrom("+SQL_T
+")ASTABLEgroupbyTABLENAMEWITHUR";
RowSetDynaClassResultTableName
=getResultSet(SQL_QUERY_TABLE_NAME);

//获取所有表名
Listrows=ResultTableName.getRows();
intsize=rows.size();

System.out.println(
"表架构名:"+args[5]);
System.out.println(
"表筛选名:"+args[6]);
System.out.println(
"表名|最大分区占比|最小分区占比|差值");

for(inti=0;i<size;i++){
DynaBeanDBean
=(DynaBean)rows.get(i);

//扫描所有表的情况
RowSetDynaClassResult=getResultSet(setKeyToSQLString(SQL_TIAOJIAN,DBean.get("tablename").toString(),
DBean.get(
"schema").toString()));
ListListrows
=Result.getRows();

if(Listrows.size()>0){
DynaBeanDBean2
=(DynaBean)Listrows.get(0);

System.out.println(DBean2.get(
"tablename")+"|"+DBean2.get("max")+"|"+DBean2.get("min")
+"|"+DBean2.get("cha"));
}
}
}

privatestaticStringsetKeyToSQLString(StringsourceSQL,StringTableName,StringSchmea){
StringSQL_KEY
=
"selectnamefromSYSIBM.SYSCOLUMNSwherePARTKEYSEQ=1ANDTBNAME='#TABLENAME#'ANDTBCREATOR='#SCHEMA#'WITHUR";

SQL_KEY
=SQL_KEY.replaceAll("#TABLENAME#",TableName);
SQL_KEY
=SQL_KEY.replaceAll("#SCHEMA#",Schmea);

RowSetDynaClassResultTableName
=getResultSet(SQL_KEY);
Listrows
=ResultTableName.getRows();
DynaBeanDBean
=(DynaBean)rows.get(0);

//替换表名
sourceSQL=sourceSQL.replaceAll("#TALBE#",Schmea+"."+TableName);

returnsourceSQL.replaceAll("#KEY#",DBean.get("name").toString());
}
}



  执行的方式和参数在CLI方式下:java -jar Partions_fat.jar 10.154.144.40 50000 数据库名 用户名 密码 架构名 表的筛选条件
  前面2个是 IP 和数据端口 (该程序可以在安装jre的机器上执行,不必需要安装IBM DB2客户端)
  执行的效果为:
  (分区正常的)
DSC0000.jpg

  (分区不太正常的现象)

  说面一下:
  最大分区占比 : 是该表在所有节点所占的最大比之;
  最小分区占比 : 是该表在所有节点所占的最小比之;
  差值:最大分区占比-最小分区占比
  一个表的分区键如果设置的正确那么差值就应该是0.01~0.05之间,如果不正确那么就可以去找找原因了。
  可能你会说程序只用Sysout打印出来而已,不好备查。OK , 你执行的
  java -jar Partions_fat.jar 10.154.144.40 50000 数据库名 用户名 密码 架构名 表的筛选条件 >> 1.txt
  提供一个独立的打包文件下载:
当您的朋友需要提取此文件时只需:
匿名提取文件连接 http://pickup.mofile.com/1627308298166791
或登录Mofile,使用提取码 1627308298166791 提取文件

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301069-1-1.html 上篇帖子: 关于 DB2 的 数据库分页技术 分段查询 下篇帖子: 关于DB2存储过程的几个小实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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