许多个人更新的速度与一次大型更新

时间:2013-11-14 00:41:56

标签: sql postgresql

我有一个带有主要id列(自动索引),两个子id列(也是索引)和12列几何类型(Polygon)的表。如果我要在这个表上更新大约200万行,那么运行大约200万个单独的更新语句比如

更快
update TABLE_NAME set ( COLUMNS ) = ( VALUES ) where ID_COLUMN = NEXT_ID

或者更快地执行一些较小数量的较大更新语句,如answer

update TABLE_NAME as update_t set
COLUMNS = new_vals.COLUMNS
from (values
(id, polygon1val, polygon2val, ... polygon12val),   /* row 1 */
(id, polygon1val, polygon2val, ... polygon12val),   /* row 2 */
...                                                 /* ...   */
(id, polygon1val, polygon2val, ... polygon12val)    /* row N */
) as new_vals( COLUMNS )
where new_vals.id = update_t.id

如果是后者,您对N可能是什么有什么建议吗?是N =〜2mil,还是一些较小的子集(我会重复,直到它们全部完成)?

编辑:显然,在前一种情况下,我会使用准备好的声明。但我也想知道,在后一种情况下,尝试使用预备声明是否有任何好处?

我正在使用PostgreSQL 9.2。

1 个答案:

答案 0 :(得分:3)

通常,批处理操作设置越好,数据库就越快地制定选项。如果您单独运行更新,唯一的选择是“找到受影响的一行,删除它,插入新行”

如果您可以批量更新,那么规划人员可以决定顺序扫描是否比一堆索引扫描更快(并且很可能是因为您可以利用预读缓存)。换句话说,更新大量行的一个命令几乎总是比更新单行的许多命令执行得更好,甚至除了计划开销之外。