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客户端)
执行的效果为:
(分区正常的)

(分区不太正常的现象)

说面一下:
最大分区占比 : 是该表在所有节点所占的最大比之;
最小分区占比 : 是该表在所有节点所占的最小比之;
差值:最大分区占比-最小分区占比
一个表的分区键如果设置的正确那么差值就应该是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 提取文件 |
分享到:
相关推荐
这种情况通常是由于表的某些属性没有被正确设置。例如,表可能缺少`NO OVERHEAD`属性。 **如何指定该属性:** 在建表语句中加入`NO OVERHEAD`属性,如: ```sql CREATE TABLE YOUR_TABLE (COL1 INT) ORGANIZE BY ...
- **看程序或语句具体的执行计划SHELL(改写后的语句)**:通过查看执行计划来分析SQL语句的执行路径,从而找出性能瓶颈。 - **两个表做JOIN的不同方式的区别**:不同的JOIN方式会影响查询的性能,例如`NOT IN`、`...
- **处理方法**:审查用户定义的函数或存储过程的代码,以找出潜在问题。 **30. +46401609 - 命名的存储过程超出了它可能返回的查询结果集的个数限制** - **描述**:存储过程返回的结果集数量超过限制。 - **...
- 使用DB2的内置监控工具,如db2top、db2pd等,实时分析系统性能,找出瓶颈。 - 利用性能分析报告,定位性能问题并制定优化策略。 8. **维护与更新**: - 定期进行数据库维护,如重新组织表、重建索引,保持...
你可以使用DB2的性能监视工具,如db2top或db2pd,来分析数据库的运行状态,找出性能瓶颈并采取相应的优化措施。此外,合理的数据库设计和SQL编程实践也是提升性能的重要手段。 安全性是DB2不可忽视的部分。DB2提供...
1. 查询优化:使用EXPLAIN分析查询计划,找出性能瓶颈。优化SQL语句,如避免全表扫描,使用JOIN代替子查询等。 2. 物理设计:合理的表分区、索引设计、数据分布策略能显著提升查询性能。考虑负载均衡和I/O效率,...
使用EXPLAIN分析查询计划,找出性能瓶颈,并通过调整SQL语句或创建新索引来改善。 3. 表设计:采用合适的数据类型,减少冗余数据,设计合理的表分区策略,有助于提高数据访问效率。 4. 内存调优:DB2的缓冲池是...
2. **优化SQL性能**:如果SQL执行效率低下,使用`db2pd -sql`查看其执行计划,找出可能的瓶颈,如全表扫描、排序过多等,然后进行相应的索引优化或SQL改写。 3. **监控资源使用**:定期运行`db2pd -dbm`,检查缓冲...
总的来说,"DB2技术参考大全 高清版"将深入解析DB2的各种特性和功能,包括但不限于SQL语法、存储过程、触发器、安全性管理、分区策略等,旨在帮助读者全面理解和应用DB2,以应对各种复杂的数据库管理挑战。...
5. **监控和分析**:使用DB2的性能监控工具,如MON_GET_PROCEDURE和MON_GET_CALL,来分析存储过程的执行情况,找出瓶颈并进行优化。 6. **代码优化**:避免冗余的计算和无效的数据库访问,确保SQL语句简洁高效。 7...
例如,使用`db2diag.log`文件可以追踪数据库的运行日志,找出错误源头;遇到数据丢失,可能需要利用DB2的备份和恢复功能进行数据恢复。 此外,资料中可能还会涉及DB2的高可用性和集群技术,如纯度复制(PureScale)...
DB2是一款由IBM开发的关系型数据库管理系统,广泛应用于企业级数据...通过掌握以上DB2的实用技巧,你可以更加熟练地应对数据库管理中的各种挑战,提升数据库性能,保障数据安全,从而在实际工作中发挥出DB2的强大功能。
例如,找出所有薪资超过5000的员工: ```sql SELECT * FROM Employees WHERE Salary > 5000; ``` “更新数据”是数据库操作的另一个重要方面。使用`UPDATE`语句,我们可以修改已存在的记录。比如提升所有部门经理...
通过使用DB2 Explain工具分析查询执行计划,可以找出性能瓶颈并进行相应调整。合理规划数据分区策略也能显著提升查询效率。 五、备份与恢复 数据保护是数据库管理的关键环节。DB2提供了多种备份类型(如完整备份、...
在SQL和DB2数据库开发过程中,遇到错误代码是常见的现象。这些错误代码提供了关于执行的SQL语句或数据库操作失败的详细信息,...在实际开发中,遇到错误时,可以查阅DB2的官方文档或使用DB2的错误信息来找出解决方案。
通过分析日志,可以找出导致错误的时间点和操作。 3. **SQL错误代码**:DB2返回的SQL状态码和错误代码提供了关于问题的详细信息。学习并理解这些代码能快速定位问题。 4. **Diagnostics Kit**:IBM提供了一套DB2...
同时,了解并使用DB2的查询优化器(QOPT)生成的执行计划,有助于找出性能瓶颈。 3. **内存管理**:DB2使用缓冲池来缓存数据和索引,调整缓冲池大小和分配策略,可以减少磁盘I/O,提高性能。理解DB2的共享内存结构...
DB2错误大全主要涵盖了一系列与DB2数据库管理系统相关的SQLCODE错误和SQLSTATE信息。...在遇到这些问题时,通常需要检查SQL语句的语法、表和索引的定义、权限设置以及数据库配置,以找出问题的根源并进行相应的修复。