日期:2014-05-20  浏览次数:20881 次

程序运行效率优化
最近在玩数据采集程序,有两张表,一张是在用的表(以下称为主表),一张是采集下来的数据表,两张表分别有15万和30万条记录,现在要对两张表进行比较,比较的字段大概有30个,即两种表中ID号相同的情况下,如果这30个字段中有一个不相同就要把采集数据表中的这条记录存起来。

现在程序运行起来很慢,整个跑完要一天。我目前的逻辑是先把主表的ID号查出来,放在dataset中,然后循环读dataset中的ID号作为条件,并且把这30个字段的不等的条件也加进查询语句中去查采集数据表,即select b.xx,b.yy … from table a,table b where (a.aa<>b.aa or a.bb <> b.bb ……) and ID=主表的值(常量)。
两个表的索引都建了,不过这30个字段中只有两三个在索引列中。

这样运行起来速度太慢太慢,想问问各位大虾怎么调整程序,使得运行速度提升。

------解决方案--------------------
应从算法上减少数据量的操作,如比较过的做个标识,其他就是SQL语句的优化了
------解决方案--------------------
用算法 代替 多余的 步骤

SQL 该存储过程 

如果你的内存足够 只是 程序的 速度慢

做多线程处理
------解决方案--------------------
试试这样:
分别把两个表的每行数据(除ID)求个hash值,再比较相同ID的hash值是否相同,这个肯定快。
你的比较慢是因为比较的字段太多,而且没法使用索引造成的。其实15万和30万的比较并不算很大的数据
------解决方案--------------------
SELECT *
FROM (SELECT ID,CHECKSUM(*) hashvalue FROM 表1) a
inner join 
(SELECT ID,row_id,CHECKSUM(*) hashvalue FROM 表2) b
ON a.id=b.id
where a.hashvalue<>b.hashvalue

试过表1有122万,表2有145万,30多秒搞定
------解决方案--------------------
我目前的逻辑是先把主表的ID号查出来,放在dataset中,然后循环读dataset中的ID号作为条件
==
1. 遍历主表,把所有id存放在一个Dictionary的key里,value为对应id的hash值
2. 遍历从表,如果id不在Dictionary里,则添加;如果id在Dictionary中,比较从表的hash值与Dictionary对应的value值,相同则跳过,不同则更新
------解决方案--------------------
1.将两张表中所有要比对的字段都赋值给List<实体类>中
2.将实体类中数据项序列化
3.计算数据项序列化后的MD5值
4.使用并行计算PLINQ比较相同ID的两条记录的MD5值

最近做了个类似项目,30w数据几分钟搞定