我有一个带有主要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。
答案 0 :(得分:3)
通常,批处理操作设置越好,数据库就越快地制定选项。如果您单独运行更新,唯一的选择是“找到受影响的一行,删除它,插入新行”
如果您可以批量更新,那么规划人员可以决定顺序扫描是否比一堆索引扫描更快(并且很可能是因为您可以利用预读缓存)。换句话说,更新大量行的一个命令几乎总是比更新单行的许多命令执行得更好,甚至除了计划开销之外。