SqlComparison
package com.ufo.leftjoin; import java.security.MessageDigest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.log4j.Logger; // Used for JDBC connection to DB class DBParam { public static final String Driver = "oracle.jdbc.driver.OracleDriver"; public static final String DbUrl = "。。。。。。。。MSAPDB"; public static final String User = "R。。。。。。。A_USER"; public static final String Pswd = "FF。。。。。。。。wCP"; } // Used for collection sort class KeyValue implements Comparable<KeyValue> { String key; Object value; @Override public int compareTo(KeyValue another) { return this.key.compareTo(another.key); } } // Used for hold columns class DhItem{ String order_no; String shipper_code; String vehicle_name; String vehicle_code; String reason_name_mobile; String status_name_mobile; public String toString() { List<String> ls=new ArrayList<String>(); ls.add(order_no); ls.add(shipper_code); ls.add(vehicle_name); ls.add(vehicle_code); ls.add(reason_name_mobile); ls.add(status_name_mobile); return String.join(",", ls); } } // Left jion/inner join comparison public class SqlComparison { private static Logger log = Logger.getLogger(SqlComparison.class); public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { Class.forName(DBParam.Driver).newInstance(); Properties pro = new Properties(); pro.setProperty("user", DBParam.User);// 这里不是username或是usr! pro.setProperty("password", DBParam.Pswd);// 这里不是pswd // pro.setProperty("initialSize", "10"); // pro.setProperty("maxActive", "12"); // pro.put("remarksReporting","true");// 这一句才能让rs.getString("REMARKS")起作用 conn = DriverManager.getConnection(DBParam.DbUrl, pro); stmt = conn.createStatement(); SqlComparison sc = new SqlComparison(); sc.queryTotalCntinDH(stmt); sc.testLeftJoin(stmt); sc.testInnerJoin(stmt); sc.compareTwoPlan(stmt); } catch (Exception e) { System.out.print(e.getMessage()); e.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (SQLException e) { log.error("Can't close stmt/conn because of " + e.getMessage()); } } } /** * Compare left to inner * @param stmt * @throws SQLException */ private void compareTwoPlan(Statement stmt) throws SQLException { long startMs = System.currentTimeMillis(); String leftSql=getLeftjoinSql(); Map<String,DhItem> leftMap=new HashMap<String,DhItem>(); ResultSet rs = stmt.executeQuery(leftSql); while (rs.next()) { DhItem dhItem=new DhItem(); dhItem.order_no=rs.getString("order_no"); dhItem.shipper_code=rs.getString("shipper_code"); dhItem.vehicle_name=rs.getString("vehicle_name"); dhItem.vehicle_code=rs.getString("vehicle_code"); dhItem.reason_name_mobile=rs.getString("reason_name_mobile"); dhItem.status_name_mobile=rs.getString("status_name_mobile"); leftMap.put(toMD5(dhItem.toString()), dhItem); } String innerSql=getNewInnerSql(); Map<String,DhItem> innerMap=new HashMap<String,DhItem>(); rs = stmt.executeQuery(innerSql); while (rs.next()) { DhItem dhItem=new DhItem(); dhItem.order_no=rs.getString("order_no"); dhItem.shipper_code=rs.getString("shipper_code"); dhItem.vehicle_name=rs.getString("vehicle_name"); dhItem.vehicle_code=rs.getString("vehicle_code"); dhItem.reason_name_mobile=rs.getString("reason_name_mobile"); dhItem.status_name_mobile=rs.getString("status_name_mobile"); innerMap.put(toMD5(dhItem.toString()), dhItem); } List<DhItem> onlyInLeftLs=new ArrayList<DhItem>(); int count=0; for(String key:leftMap.keySet()) { if(innerMap.containsKey(key)) { count++; }else { DhItem dhItem=leftMap.get(key); onlyInLeftLs.add(dhItem); } } log.info("There are "+toEastNumFormat(count)+" records in both left and inner."); log.info("There are "+toEastNumFormat(onlyInLeftLs.size())+" records only in left."); List<DhItem> onlyInInnerLs=new ArrayList<DhItem>(); count=0; for(String key:innerMap.keySet()) { if(leftMap.containsKey(key)) { count++; }else { DhItem dhItem=innerMap.get(key); onlyInInnerLs.add(dhItem); } } log.info("There are "+toEastNumFormat(count)+" records in both left and inner."); log.info("There are "+toEastNumFormat(onlyInInnerLs.size())+" records only in inner."); long endMs = System.currentTimeMillis(); log.info("It takes "+ms2DHMS(startMs,endMs)+" to run function:'compareTwoPlan'."); } private String getLeftjoinSql() { StringBuilder sb = new StringBuilder(); sb.append(" SELECT "); sb.append(" DH1.ORDER_NO, "); sb.append(" DH1.SHIPPER_CODE , "); sb.append(" DH1.VEHICLE_NAME, "); sb.append(" DH1.VEHICLE_CODE , "); sb.append(" DH1.REASON_NAME_MOBILE, "); sb.append(" DH1.STATUS_NAME_MOBILE "); sb.append(" from "); sb.append(" DELIVERY_HISTORY DH1 "); sb.append(" left JOIN DELIVERY_HISTORY DH2 on "); sb.append(" DH1.SHIPPER_CODE = DH2.SHIPPER_CODE "); sb.append(" and DH1.ORDER_NO = DH2.ORDER_NO "); sb.append(" and DH2.UPDATED_DATETIME > DH1.UPDATED_DATETIME "); sb.append(" where DH2.UPDATED_DATETIME IS NULL "); sb.append(" and DH1.DISABLED_FLG = 0 "); String sql = sb.toString(); return sql; } private String getInnerSql() { StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" DH1.ORDER_NO, "); sb.append(" DH1.SHIPPER_CODE , "); sb.append(" DH1.VEHICLE_NAME, "); sb.append(" DH1.VEHICLE_CODE , "); sb.append(" DH1.REASON_NAME_MOBILE, "); sb.append(" DH1.STATUS_NAME_MOBILE "); sb.append(" from "); sb.append(" DELIVERY_HISTORY dh1 , "); sb.append(" (select SHIPPER_CODE,ORDER_NO,max(UPDATED_DATETIME) as utime from DELIVERY_HISTORY "); sb.append(" group by SHIPPER_CODE,ORDER_NO) dh2 "); sb.append(" where "); sb.append(" dh1.SHIPPER_CODE=dh2.SHIPPER_CODE and "); sb.append(" dh1.ORDER_NO=dh2.ORDER_NO and "); sb.append(" dh1.UPDATED_DATETIME=dh2.utime and "); sb.append(" dh1.DISABLED_FLG='0' "); String sql = sb.toString(); return sql; } private String getNewInnerSql() { StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" a.ORDER_NO, "); sb.append(" a.SHIPPER_CODE , "); sb.append(" a.VEHICLE_NAME, "); sb.append(" a.VEHICLE_CODE , "); sb.append(" a.REASON_NAME_MOBILE, "); sb.append(" a.STATUS_NAME_MOBILE ,"); sb.append(" a.UPDATED_DATETIME"); sb.append(" from DELIVERY_HISTORY a"); sb.append(" where not exists(select 1 "); sb.append(" from DELIVERY_HISTORY b"); sb.append(" where b.SHIPPER_CODE=a.SHIPPER_CODE and b.ORDER_NO=a.ORDER_NO and b.UPDATED_DATETIME>a.UPDATED_DATETIME)"); sb.append(" and a.DISABLED_FLG=0 "); String sql = sb.toString(); return sql; } // test leftjoin plan private boolean testLeftJoin(Statement stmt) throws SQLException { StringBuilder sb = new StringBuilder(); sb.append(" SELECT "); sb.append(" DH1.ORDER_NO, "); sb.append(" DH1.SHIPPER_CODE "); sb.append(" from "); sb.append(" DELIVERY_HISTORY DH1 "); sb.append(" left JOIN DELIVERY_HISTORY DH2 on "); sb.append(" DH1.SHIPPER_CODE = DH2.SHIPPER_CODE "); sb.append(" and DH1.ORDER_NO = DH2.ORDER_NO "); sb.append(" and DH2.UPDATED_DATETIME > DH1.UPDATED_DATETIME "); sb.append(" where DH2.UPDATED_DATETIME IS NULL "); sb.append(" and DH1.DISABLED_FLG = 0 "); String sql = sb.toString(); long startMs = System.currentTimeMillis(); stmt.executeQuery(sql); long endMs = System.currentTimeMillis(); log.info("It takes "+ms2DHMS(startMs,endMs)+" to run leftjoin plan."); log.info("Got " + toEastNumFormat(evaluateCntinSql(sql,stmt)) + " records after running leftjoin."); return true; } // test innerjoin plan private boolean testInnerJoin(Statement stmt) throws SQLException { StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" a.ORDER_NO, "); sb.append(" a.SHIPPER_CODE "); //sb.append(" a.VEHICLE_NAME, "); //sb.append(" a.VEHICLE_CODE , "); //sb.append(" a.REASON_NAME_MOBILE, "); //sb.append(" a.STATUS_NAME_MOBILE ,"); //sb.append(" a.UPDATED_DATETIME"); sb.append(" from DELIVERY_HISTORY a"); sb.append(" where not exists(select 1 "); sb.append(" from DELIVERY_HISTORY b"); sb.append(" where b.SHIPPER_CODE=a.SHIPPER_CODE and b.ORDER_NO=a.ORDER_NO and b.UPDATED_DATETIME>a.UPDATED_DATETIME)"); sb.append(" and a.DISABLED_FLG=0 "); String sql = sb.toString(); long startMs = System.currentTimeMillis(); stmt.executeQuery(sql); long endMs = System.currentTimeMillis(); log.info("It takes "+ms2DHMS(startMs,endMs)+" to run inner join plan."); log.info("Got " + toEastNumFormat(evaluateCntinSql(sql,stmt)) + " records after running inner join."); return true; } // evaluate how many records int resultset after running a sql private long evaluateCntinSql(String sql,Statement stmt) throws SQLException { String sql2 = "select count(*) as cnt from ("+sql+") "; ResultSet rs = stmt.executeQuery(sql2); while (rs.next()) { int cnt = rs.getInt("cnt"); return cnt; } return 0; } // query how many records in table delivery_history private boolean queryTotalCntinDH(Statement stmt) throws SQLException { String sql = "select count(*) as cnt from delivery_history"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { int cnt = rs.getInt("cnt"); log.info("There are " + toEastNumFormat(cnt) + " records in the table:'delivery_history'."); } return true; } // 将整数在万分位以逗号分隔表示 public static String toEastNumFormat(long number) { DecimalFormat df = new DecimalFormat("#,####"); return df.format(number); } /** * change seconds to DayHourMinuteSecond format * * @param startMs * @param endMs * @return */ private static String ms2DHMS(long startMs, long endMs) { String retval = null; long secondCount = (endMs - startMs) / 1000; String ms = (endMs - startMs) % 1000 + "ms"; long days = secondCount / (60 * 60 * 24); long hours = (secondCount % (60 * 60 * 24)) / (60 * 60); long minutes = (secondCount % (60 * 60)) / 60; long seconds = secondCount % 60; if (days > 0) { retval = days + "d" + hours + "h" + minutes + "m" + seconds + "s"; } else if (hours > 0) { retval = hours + "h" + minutes + "m" + seconds + "s"; } else if (minutes > 0) { retval = minutes + "m" + seconds + "s"; } else { retval = seconds + "s"; } return retval + ms; } public static String toMD5(String key) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = key.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } }
--END-- 2019-12-20 18:26
SqlComparison的更多相关文章
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- CentOS MongoDB 高可用实战
原文:https://www.sunjianhua.cn/archives/centos-mongodb.html 一.MongoDB 单节点 1.1.Windows 版安装 1.1.1 获取社区版本 ...
- 170504、MongoDB和MySQL对比(译)
一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...
- urlx
2015-09-24 23:41:26 centos6.6下安装MongoDB3.0.1 https://www.percona.com/doc/percona-tokumx/installation ...
- Node.js 操作Mongodb
Node.js 操作Mongodb1.简介官网英文文档 https://docs.mongodb.com/manual/ 这里几乎什么都有了MongoDB is open-source docum ...
- SQL to MongoDB Mapping Chart
http://docs.mongodb.org/manual/reference/sql-comparison/ In addition to the charts that follow, you ...
- MongoDB 走马观花(全面解读篇)
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- 了解 MongoDB 看这一篇就够了【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 了解 MongoDB 看这一篇就够了【华为云分享】
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
随机推荐
- Java面试通关要点 汇总集【最终版】
本文转载自公众号:服务端思维,阅读大约需要7分钟.梁兄的知识储备很丰富,组织的知识星球里也是干货十足,平常还会有技术研习等活动,欢迎关注. 首先,声明下,以下知识点并非阿里的面试题.这里,笔者结合自己 ...
- Python数据预处理之清及
使用Pandas进行数据预处理 数据清洗中不是每一步都是必须的,按实际需求操作. 内容目录 1.数据的生成与导入 2.数据信息查看 2.1.查看整体数据信息 2.2.查看数据维度.列名称.数据格式 2 ...
- sparkstreaming写入hbase表中总结
执行spark代码插入数据到hbase表中去的时候,遇到的错误 1. 缺少hadoop-mapreduce-client-core-2.5.1.jar包 错误:java.lang.ClassNotFo ...
- Mirai 通过弱密码爆破摄像头 形成僵尸网络——尼玛值得深思的是作者居然是做安全研究的
Mirai(日语:ミライ[1],中文直译“未来”[2][3])是一款恶意软件,它可以使运行Linux的计算系统成为被远程操控的“僵尸”,以达到通过僵尸网络进行大规模网络攻击的目的.Mirai的主要感染 ...
- Linux学习26-linux查看某个时间段的日志(sed -n)-史上最详细
前言 在linux上查找日志的时候,如果我想找出某个时间段的日志,比如查找今天早上8点到下午2点的日志. 用grep不太方便直接过滤出来,可以使用sed根据时间去查找 sed -n '/开始时间日期/ ...
- Zabbix4.0如何添加监控信息
二.添加监控信息 监控Windows主机: 首先需要在Windows主机上安装好Zabbix agent,安装方法,见另一篇博客,https://www.cnblogs.com/opsprobe/p/ ...
- DT下重新定义设置发布发布条数后的跳转页面
destoon系统有些地方还是做得不够细致,今天给大家分享一个重新定义发布条数满了以后的页面跳转 正常逻辑跳转应该是会员升级页面而不是会员中心首页,修改方法如下:(感谢DT朋友提供的修改方案) 打 ...
- Ubuntu设置终端操作行为的回收站
Ubuntu设置终端操作行为的回收站(默认情况下,在终端删除文件,会直接删除) 参考自:https://help.aliyun.com/knowledge_detail/41359.html?spm= ...
- iis站点设置错误页面返回http状态码为404而不是302或其他
今天一位客户说网站错误页面返回的状态码是302而不是404,问ytkah要如何处理.这个应该是设置没有正确的原因.我们一步步来排查一下.1.首先打开iis管理器,左侧选择具体的站点,在右侧窗口中点击4 ...
- Linux 系统结构,nglinx
Linux 系统结构 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统. N ...