SQL优化:A表100万条数据,B表95万,怎样最快找到A的5万插到B

时间:2022-10-17 19:19:28
如题,A表100万条数据,B表95万,怎样最快找到A的5万插到B
现状:insert into B (ddd,eee) select A.ddd,A.eee from B left outer join A on B.ff = A.ff and B.gg = A.gg where b.ss is null and b.hh !=Z

主要想修改SQL文,减少查询量

12 个解决方案

#1


insert into B (ddd,eee) 
select A.ddd,A.eee from A A 
WHERE NOT EXISTS(SELECT 1 FROM B  WHERE  B.ff = A.ff and B.gg = A.gg And b.hh !='Z')


这样的吗>

插入时候,条件上有索引没,禁用非聚集索引

如果只是查一个表的数据用EXISTS效率高

#2


如A,B两个表,  
当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:  
select  *  from  A  where  id  in  (select  id  from  B)  
 
当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:  
select  *  from  A  where  exists  (select  1  from  B  where  id  =  A.id  and  col1  =  A.col1)  
 
当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:  
select  *  from  A  left  join  B  on  id  =  A.id    
 
所以使用何种方式,要根据要求来定。  



刚小麦发的,呵呵

#3


引用 1 楼 sql77 的回复:
SQL codeinsertinto B (ddd,eee)select A.ddd,A.eeefrom A AWHERENOTEXISTS(SELECT1FROM BWHERE  B.ff= A.ffand B.gg= A.ggAnd b.hh!='Z')

 这样的吗>

 插入时候,条件上有索引没,禁用非聚集索引

 如果只是查一个表的数据用EXISTS效率高

目前两表都没有索引

#4


建个索引,循环处理完,索引删除就是了。

这种一次性操作又不是执行频率很高。

#5


insert into
 B (ddd,eee) 
select
 A.ddd,A.eee from A A 
WHERE
 NOT EXISTS(SELECT 1 FROM B  WHERE  B.ff = A.ff and B.gg = A.gg And b.hh !='Z' and ss is not null)

#6


还是建立索引效率高点

#7


学习

#8


引用 4 楼 fcuandy 的回复:
建个索引,循环处理完,索引删除就是了。

这种一次性操作又不是执行频率很高。

建立索引为快?为了检索数据使用?

#9


学习,谢谢

#10


学习

#11


引用 8 楼 beirut 的回复:
引用 4 楼 fcuandy 的回复:
 建个索引,循环处理完,索引删除就是了。

 这种一次性操作又不是执行频率很高。

 建立索引为快?为了检索数据使用?


100w对95w分批循环处理的时候, 可以想想没有索引的情况下,分批的意义有多大?
总共插入5w行,那么在索引处理上的消耗又会是多少?

#12


全都是些牛逼人啊。学习了。。

#1


insert into B (ddd,eee) 
select A.ddd,A.eee from A A 
WHERE NOT EXISTS(SELECT 1 FROM B  WHERE  B.ff = A.ff and B.gg = A.gg And b.hh !='Z')


这样的吗>

插入时候,条件上有索引没,禁用非聚集索引

如果只是查一个表的数据用EXISTS效率高

#2


如A,B两个表,  
当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:  
select  *  from  A  where  id  in  (select  id  from  B)  
 
当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:  
select  *  from  A  where  exists  (select  1  from  B  where  id  =  A.id  and  col1  =  A.col1)  
 
当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:  
select  *  from  A  left  join  B  on  id  =  A.id    
 
所以使用何种方式,要根据要求来定。  



刚小麦发的,呵呵

#3


引用 1 楼 sql77 的回复:
SQL codeinsertinto B (ddd,eee)select A.ddd,A.eeefrom A AWHERENOTEXISTS(SELECT1FROM BWHERE  B.ff= A.ffand B.gg= A.ggAnd b.hh!='Z')

 这样的吗>

 插入时候,条件上有索引没,禁用非聚集索引

 如果只是查一个表的数据用EXISTS效率高

目前两表都没有索引

#4


建个索引,循环处理完,索引删除就是了。

这种一次性操作又不是执行频率很高。

#5


insert into
 B (ddd,eee) 
select
 A.ddd,A.eee from A A 
WHERE
 NOT EXISTS(SELECT 1 FROM B  WHERE  B.ff = A.ff and B.gg = A.gg And b.hh !='Z' and ss is not null)

#6


还是建立索引效率高点

#7


学习

#8


引用 4 楼 fcuandy 的回复:
建个索引,循环处理完,索引删除就是了。

这种一次性操作又不是执行频率很高。

建立索引为快?为了检索数据使用?

#9


学习,谢谢

#10


学习

#11


引用 8 楼 beirut 的回复:
引用 4 楼 fcuandy 的回复:
 建个索引,循环处理完,索引删除就是了。

 这种一次性操作又不是执行频率很高。

 建立索引为快?为了检索数据使用?


100w对95w分批循环处理的时候, 可以想想没有索引的情况下,分批的意义有多大?
总共插入5w行,那么在索引处理上的消耗又会是多少?

#12


全都是些牛逼人啊。学习了。。