是否有必要减少更新时间,甚至使用group by语句?

时间:2016-11-18 05:13:42

标签: sql query-optimization

有两个表

表A col1,col2,col3

  • 100200,AAA;
  • 101200,BBB;
  • 102200,CCC;

表B col1,col2,col3

  • AAA,1,OK;
  • AAA,2,OK;
  • AAA,3,OK;
  • BBB,1,细
  • BBB,3,细

假设表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声明会消耗更多的计算吗?

3 个答案:

答案 0 :(得分:0)

您应该对这两个查询运行EXPLAIN以查看数据库实际处理的事情。话虽如此,有一点在性能方面表现突出。在您的第一个查询中:

update a set a.col2 = b.col3
from A a, B b
where a.col3 = b.col1

您通过AB列与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执行计划,它会在后台重复数据删除数据,因此无需手动识别,请参见下面的截图。

sql server automatically sort/distinct