2017-02-01 111 views
0

想知道是否有办法使SQL语句的速度更快。如何加快此更新声明

UPDATE table_one SET column_x = table_two.column_x FROM table_two 
WHERE table_one.column_y = table_two.column_y; 

当前上述查询已经运行了3个小时以上。有关如何使其更快的建议?

详情:

  • table_one取得了1.9亿的记录
  • table_two取得了3.9亿的记录
  • column_x和COLUMN_Y两个表中都是整数。
  • 两个表中的COLUMN_Y被索引

AM上的虚拟机中运行的RAM 120GB和在PostgreSQL 9.3 22芯。

+0

问题,WHERE条款的顺序是否重要?即如果我们说'table_two.column_y = table_one.column_y'而不是'table_one.column_y = table_two.column_y'? – lukik

+0

如果我的建议对你没有帮助,而且你还在寻找解决方案,请添加运行你的命令的解释分析结果。 –

回答

3

你并不需要更新所有记录,至少:

UPDATE table_one 
     SET column_x = table_two.column_x 
    FROM table_two 
     WHERE table_one.column_y = table_two.column_y 
     AND table_one.column_x != table_two.column_x; 

也大抵可以帮助是两个领域的X和Y两个表建立索引。

+0

我的理解是,非索引列将处理插入/更新比索引更快,因此离开table_one.column_x未索引的原因,因为它是我们正在更新的一个.. – lukik

+0

但也可以使用'索引只扫描 –

+0

在这种情况下,我正在更新所有记录,因为我已确保'table_one' *中的所有记录* - 我们正在更新的表格* *包含在'table_two' *中 - 我们正在更新的表格 - *。那么你对'你不需要更新所有记录'的建议仍然存在? – lukik