5

我有一个表,其中有一个主 id 列(自动索引)、两个子 id 列(也有索引)和 12 个几何类型(多边形)的列。如果我要更新此表上的约 200 万行,运行约 200 万条单独的更新语句会更快吗?

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

或者像这个答案中那样做一些较小数量的较大更新语句是否更快

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。

4

1 回答 1

7

通常,您可以将操作批处理成组的效果越好,数据库在加快处理速度方面的选择就越多。如果您单独运行更新,唯一的选择是“找到受影响的一行,删除它,插入新的”

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

于 2013-12-09T03:00:43.463 回答