问题描述:在为客户修复数据的时候,要把所有表里的数据一一比对主键值,获取差异。初始的做法是从数据库A里把表table1的数据逐个取出来(select key1,key2 from table1),然后把结果的key1,key2拿到数据库里对应的表table1里进行查询,若无结果,说明不存在,记录该记录。
从思路上没有错,但是效能太差。客户资料若是少还好说,但是如果表的资料上了10万笔以上就会出现失去响应。
解决办法:使用dblink把数据库B的资料拓展到数据库A
drop view IF EXISTS remote_tbsslipx;
CREATE VIEW remote_tbsslipx AS SELECT * FROM dblink('host=38.49.32.78 port=5432 dbname=cao50001 user=postgres password=111111','SELECT sslipno,skind From tbsslipx') AS t(sslipno varchar(17),skind varchar(4))//在数据库A里通过dblink建立数据库B数据的view select sslipno from remote_tbsslipx where skind='1' except select sslipno from tbsslipx where skind='1';//在数据库A用相关表进行了2次比较获取结果,这里用了except。EXCEPT 从左查询中返回右查询没有找到的所有非重复值。
经这样修改后,16万笔数据进行1分钟不到就查询出结果。 |