请教一SQL语句优化

sh98_wgf 2012-07-16 08:32:27
有IP_ONU 和SYNC_BRAS_User两张表,现在要用Sync_BRAS_USER更新IP_ONU,条件下:
1. 两张表的MAC相同但IP不相同
2. MAC在各自表内没有重复
我写了如下语句,不知道对不好,感觉不是很好,求指导
UPDATE IP_ONU SET IP=B.IP,BINIP=B.BINIP FROM SYNC_BRAS_USER AS B INNER JOIN IP_ONU AS A ON (A.MAC=B.MAC AND A.IP<>B.IP) WHERE ( A.MAC IN ( SELECT MAC FROM IP_ONU GROUP BY MAC Having Count(*)=1 ) AND B.MAC IN ( SELECT MAC FROM Sync_Bras_User GROUP BY MAC Having Count(*)=1 ) );
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
白天的猫头鹰 2012-07-26
  • 打赏
  • 举报
回复
在sql中,in关键字是逐条扫描的,即使找到了,也会扫描到完为止,因此in在大数据量的时候效率低下,从sql优化角度来说是不用in,可以使用exists替换,exists只要找到了就直接返回,而不是继续查找下去,效率上会高很多

撩天槌 2012-07-25
  • 打赏
  • 举报
回复
UPDATE IP_ONU
SET IP=B.IP,BINIP=B.BINIP
FROM SYNC_BRAS_USER AS B
INNER JOIN IP_ONU AS A ON (A.MAC=B.MAC AND A.IP<>B.IP)
WHERE (select count(*) from IP_ONU where mac=a.mac)=1
and (select count(*) from Sync_Bras_User where mac=a.mac)=1
luckings 2012-07-16
  • 打赏
  • 举报
回复

UPDATE IP_ONU SET IP=B.IP,BINIP=B.BINIP
FROM (SELECT MAC,MAX(IP) AS IP,MAX(BINIP) AS BINIP FROM Sync_Bras_User GROUP BY MAC Having
Count(*)=1 ) AS B
INNER JOIN IP_ONU AS A
ON (A.MAC=B.MAC AND A.IP<>B.IP) inner
join ( SELECT MAC FROM IP_ONU GROUP BY MAC Having Count(*)=1 ) c
on a.mac=c.mac
黄_瓜 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

能解释一下这两个语句的区别吗
[/Quote]
就死把in 改成了join 这样可能会好一些,也可能两者的结果是一样的。
你可以测试一下

另外需要在快的话就是要有一定的索引,索引可以利于查找满足更新条件的速度。
sh98_wgf 2012-07-16
  • 打赏
  • 举报
回复
能解释一下这两个语句的区别吗
筱筱澄 2012-07-16
  • 打赏
  • 举报
回复
--try
UPDATE IP_ONU SET IP=B.IP,BINIP=B.BINIP
FROM SYNC_BRAS_USER AS B
INNER JOIN IP_ONU AS A
ON (A.MAC=B.MAC AND A.IP<>B.IP)
join ( SELECT MAC FROM IP_ONU GROUP BY MAC Having Count(*)=1 ) c
on a.mac=c.mac
join ( SELECT MAC FROM Sync_Bras_User GROUP BY MAC Having Count(*)=1 ) d
on b.mac=d.mac

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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