有两个表
表A col1,col2,col3
表B col1,col2,col3
假设表A是一个非常大的表,而表B是一个小表。在表B中,col1只有一个col3值,例如,如果col1是'aaa',col3必须是'ok'
案例1:
update a set a.col2 = b.col3
from A a, B b
where a.col3 = b.col1
案例2:
update a set a.col2 = b.col3
from A a, (select col1, col3 from B group by col1,col3) b
where a.col3 = b.col1
案例1和案例2的结果是相同的,但我只是想问哪个陈述更好?案例1是否会更新表A 5次?案例2中的group by声明会消耗更多的计算吗?
答案 0 :(得分:0)
您应该对这两个查询运行EXPLAIN
以查看数据库实际处理的事情。话虽如此,有一点在性能方面表现突出。在您的第一个查询中:
update a set a.col2 = b.col3
from A a, B b
where a.col3 = b.col1
您通过A
和B
列与col3
的{{1}}表联系。如果col1
上有索引,则加入的速度可能比数据库强制执行B.col1
的全表扫描的速度快得多。但B
上的索引可能对您的第二个查询没有帮助:
B.col1
此处您将update a set a.col2 = b.col3
from A a, (select col1, col3 from B group by col1,col3) b
where a.col3 = b.col1
加入到从A
派生的表中,因此无法获得索引。所以我会选择你的第一个查询。
顺便说一句,您使用旧的ANSI-92前语法加入第一个查询,您可能想要更新它。
答案 1 :(得分:0)
由于这两个陈述在逻辑上相同(结果明智),因此它们可能具有相同的执行计划,因此具有相同的性能。
不同的执行计划可能会为每个语句提供优势。
我想强调一件事 - 嵌套循环不是实现JOIN的唯一选项,在支持HASH JOIN的数据库中,它们很少用于相等的JOIN,因此你需要修改所有关于这里的内容的方法。
答案 2 :(得分:0)
谢谢大家,根据sql执行计划,它会在后台重复数据删除数据,因此无需手动识别,请参见下面的截图。