在事务中使用 ANALYZE 会做什么?

Bre*_*ham 1 sql postgresql mvcc

假设我要批量插入/更新/删除大量行(最少 100k,最多 20M),并且必须是原子的。

由于该事务所做的更改尚未提交,因此暂停大约 10-100k 操作以ANALYZE在同一事务中运行实际上是否会通知查询规划器任何信息?

从逻辑上讲,想象一个客户正在做这样的事情:

BEGIN;

(for i, record in records)
  INSERT ...
  DELETE ...
  UPDATE ...

  (if i % 10000 == 0)
    ANALYZE;
  (end)
(end loop)

COMMIT;
Run Code Online (Sandbox Code Playgroud)

对正在运行的事务的查询计划程序有ANALYZE什么好处,或者它只会收集已提交行的统计信息吗?

jja*_*nes 5

ANALYZE 将看到同一事务中先前所做的更改。但只有同一笔交易才会使用这些新收集的统计数据。其他事务将继续使用先前的统计信息(直到大型事务提交,然后它们将获取包括现在提交的行的新统计信息)。

  • 对于未来的旁观者,我通过在一次交易期间运行“ANALYZE VERBOSE”来验证这个答案。日志输出显示分析表上仅在事务中可见的预期行数。 (2认同)