PostgreSQL表中的锁定行是否会修改表

时间:2017-09-07 14:42:05

标签: postgresql

我有一些地方可以锁定大量的表格行(例如表格内容的1/10),以便使用如下语句进行进一步处理

SELECT ......
FROM my_table
WHERE ......
FOR UPDATE;

但最终该过程并不总是最终更新锁定的行。我担心的是,当我以对表或其索引进行碎片整理的方式锁定行时,表是否会被物理修改。换句话说,锁定行会使表统计信息无效或无效。

预计此表将按索引进行聚类。我试图弄清楚表格行被锁定后是否需要CLUSTER,但没有更新。

1 个答案:

答案 0 :(得分:1)

  

我担心的是,当我以对表或其索引进行碎片整理的方式锁定行时,表是否会被物理修改。换句话说,锁定行会使表统计信息无效或无效。

当然不是。

CREATE TABLE foo AS SELECT id::int FROM generate_series(1,1e6) AS gs(id);

BEGIN; SELECT * FROM foo FOR UPDATE; COMMIT;
BEGIN
Time: 0.166 ms
Time: 771.232 ms
COMMIT
Time: 76.982 ms

BEGIN; UPDATE foo SET id=42; COMMIT;
BEGIN
Time: 0.171 ms
UPDATE 1000000
Time: 1882.144 ms
COMMIT
Time: 87.863 ms

即使是最简单的行,重写也要慢得多。

  

预计此表将按索引进行聚类。我试图弄清楚是否需要在表行被锁定但是没有更新后才需要CLUSTER。

不,如果你不更新行没有任何反应。