两张表比对,数据量各10w,如何优化

学到了吗 2014-02-24 05:47:48
需求:将表A数据同步到表B中,A大概10w条数据,B大概10w条数据
逻辑:根据字段a和b作判断(A、B中都有这两个字段),如果A表中的a、b字段都不在B表中,将A表中该记录存入B表。
请问
除了分别取出两张表,两层for循环比较,还有什么比较好的方法?
...全文
547 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-03-03
  • 打赏
  • 举报
回复
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 试试
發糞塗牆 2014-03-03
  • 打赏
  • 举报
回复
not exists加上or,很难利用到高效索引,所以慢
学到了吗 2014-03-03
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
稍微是什么意思?你现在的写法是怎样的?
就是用not exists写法,大神 你知道这种写法的数据库软件是怎么执行的吗 就是这句话是如何工作的 select * from A x where not exists(select 1 from B y where x.a=y.a or x.b=y.b )
發糞塗牆 2014-03-03
  • 打赏
  • 举报
回复
稍微是什么意思?你现在的写法是怎样的?
学到了吗 2014-03-03
  • 打赏
  • 举报
回复
感谢各位好心人的帮忙,在你们的帮助下,果然速度稍微上来了!
xiaoxiangqing 2014-02-25
  • 打赏
  • 举报
回复
关联字段要建有索引。
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
直接匹配,没必要用循环
KeepSayingNo 2014-02-25
  • 打赏
  • 举报
回复
采用下面的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
中国风 2014-02-24
  • 打赏
  • 举报
回复
在插入时看看有没有把a\b列建上索引,这样有提高查询性能
中国风 2014-02-24
  • 打赏
  • 举报
回复
insert into b(a,b)--指定插入列
select a,b --指定插入列
from A where not exists(select 1 from B where a=a.a and b=a.b)
专注or全面 2014-02-24
  • 打赏
  • 举报
回复

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



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 --如果要处理表的记录在参照表上不存在,则删除





LongRui888 2014-02-24
  • 打赏
  • 举报
回复
或者:
insert into b
select *
from a
left join b  
       on a.a = b.a and a.b = b.b
where b.a is null
LongRui888 2014-02-24
  • 打赏
  • 举报
回复
可以这么写: insert into b select * from a where not exists(select 1 from b where a.a = b.a and a.b = b.b)
Q315054403 2014-02-24
  • 打赏
  • 举报
回复
典型的程序代码思维。。在DB中,直接做个Left or Right Join ... Where Is Null就OK

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧