NutzCN Logo
问答 查询或者插入的优化。。。
发布于 123天前 作者 qq_64f81159 110 次浏览 复制 上一个帖子 下一个帖子
标签:

现在写了一个CS的比对工具,让excel里面的数据和数据库里面的2个表数据根据身份证号进行比对,找出身份证号一致的数据写入到另外一个excel中,刚开始的时候我是把所有数据读入内存,然后一条一条的查询,最后写入,但是这样很慢,10W左右的数据大概就需要1、2个小时,后来我的方法是所有excel中的数据写入到数据库临时表中,然后找出比对结果,但是这个时候插入的时间又很长,查询倒是很快,时间也得1个小时左右,我想问下还有什么办法进行优化吗,我还想到了拼SQL用where zjhm in (.....)这样或者 zjhm='' or zjhm='' 但是这样十万条左右就卡死了,这个怎么处理才更好些 。。。。。。

15 回复

总数据量有多少? 内存有多少?

总数据量最大不超过20W条,内存你是说服务器还是跑程序的客户端?

那么少... 把2个表的内容读到内存得了

我10W条数据从excel读入到内存是没有问题的,并不慢 主要是查询慢

你是说把数据库和excel的数据都读入到内存中 然后再内存中比较?

好的 谢谢了 我试试

List ygList = dao.query("bdc_regn_yg", null); 这种查询是不是效率很低,我这个才3W条数据十几分钟都没有结果。。

@qq_64f81159 用dao.each

是不是有大字段?

没有大字段啊 ,就是有几个日期型的 或者我只要其中几个字段 用sql才行吗 不想建立实体。

看字段过滤的文档

不过滤也不正常啊,这个我在sql developer中查询的话也才1秒钟啊 这个现在还没有出结果。。。

sql developer把3w条记录都显示了?

我写的是select * from bdc_regn_yg,至于他有没有优化比如我下拉的时候再进行查询就不知道了 ,但是我这样写
这个是测试类

public static void main(String[] args) {
		Ioc ioc = new NutIoc(new JsonLoader("ioc/dao.js"));
		
		Dao dao = ioc.get(Dao.class);
		System.out.println("----建立连接-------------");
		Stopwatch sw = Stopwatch.begin();
		List<YgHelper> list = getInfo(dao,"bdc_regn_yg");
		sw.stop();
		System.out.println(list.size()+"----耗时为-----"+sw.du());
	}
	
	private static List<YgHelper> getInfo(Dao dao,String tableName){
		String sqlStr="select qlrzjbh,djkid,fdzl,jzmj from "+tableName;
		Sql sql = Sqls.create(sqlStr);
		sql.setCallback(Sqls.callback.entities());
		sql.setEntity(dao.getEntity(YgHelper.class));
		dao.execute(sql);
		List<YgHelper> list = sql.getList(YgHelper.class);
		return list;
	}

这个是辅助的实体类
public class YgHelper {
private String qlrzjbh;
private String djkid;
private String fdzl;
private String jzmj;

public String getQlrzjbh() {
    return qlrzjbh;
}

public void setQlrzjbh(String qlrzjbh) {
    this.qlrzjbh = qlrzjbh;
}

public String getDjkid() {
    return djkid;
}

public void setDjkid(String djkid) {
    this.djkid = djkid;
}

public String getFdzl() {
    return fdzl;
}

public void setFdzl(String fdzl) {
    this.fdzl = fdzl;
}

public String getJzmj() {
    return jzmj;
}

public void setJzmj(String jzmj) {
    this.jzmj = jzmj;
}

}

```
结果是 30394----耗时为-----32686

32秒? 挺快的了

添加回复
请先登陆
回到顶部