日期:2014-05-16  浏览次数:20732 次

两张表比对,数据量各10w,如何优化
需求:将表A数据同步到表B中,A大概10w条数据,B大概10w条数据
逻辑:根据字段a和b作判断(A、B中都有这两个字段),如果A表中的a、b字段都不在B表中,将A表中该记录存入B表。
请问
   除了分别取出两张表,两层for循环比较,还有什么比较好的方法?
------解决方案--------------------

--这玩意不经常练习还真容易忘,哎



create table A
(
id int,
Name nvarchar(20),
Remark nvarchar(50)
)
create table B
(
id int,
Name nvarchar(20),
Address nvarchar(50),
Remark nvarchar(50)
)

insert into A values(1,'张三','测试张三');
insert into A values(2,'李四','测试李四');
insert into A values(3,'王五','测试王五');

insert into B values(1,'张三','测试张三','');
insert into B values(2,'赵六','测试赵六','');
insert into B values(3,'孙七','测试孙七','');

--无需两个表结果完全一致
insert into B (ID,Name)  
select id,Name from
(
select id,Name from A
except
select id,Name from B
)t



MERGE B --要处理的表
USING A --参照的表
ON A.ID=B.ID and A.Name=B.Name --关联条件
WHEN NOT MATCHED THEN INSERT(id,Name) VALUES(A.ID,A.Name); --如果要处理表没有参照表上的记录,则插入
--WHEN MATCHED THEN UPDATE SET A.ACOL=B.BCOL --如果记录匹配,就更新目标表的匹配行
--WHEN NOT MATCHED BY SOURCE THEN DELETE --如果要处理表的记录在参照表上不存在,则删除






------解决方案--------------------
采用下面的SQL进行数据批量插入到B表中,10W级别的数据量不算大,后续如果B表中的数据增加到百万级,可能会插入速度明显变慢,这个时候建议考虑对B表进行重建索引,现在可以在B表的a,b字段上建索引。

insert into b
select *
from a
left join b  
       on a.[a] = b.[a] and a.[b] = b.[b]
where a is null and b is null

------解决方案--------------------
稍微是什么意思?你现在的写法是怎样的?
------解决方案--------------------
not exists加上or,很难利用到高效索引,所以慢
------解决方案--------------------
SELECT  a.*
FROM    a x
        LEFT JOIN b y ON x.a = y.a
        LEFT JOIN b z ON x.b = z.b
WHERE   x.a IS NOT NULL 

试试