我有一些地方可以锁定大量的表格行(例如表格内容的1/10),以便使用如下语句进行进一步处理
SELECT ......
FROM my_table
WHERE ......
FOR UPDATE;
但最终该过程并不总是最终更新锁定的行。我担心的是,当我以对表或其索引进行碎片整理的方式锁定行时,表是否会被物理修改。换句话说,锁定行会使表统计信息无效或无效。
预计此表将按索引进行聚类。我试图弄清楚表格行被锁定后是否需要CLUSTER
,但没有更新。
答案 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。
不,如果你不更新行没有任何反应。