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

What does ANALYZE do when used within a transaction?

假设我 inserting/updating/deleting 批量处理大量行(最少 100k,最多 20M),这些行必须是原子的。

将在同一事务中每隔 10-100k 次操作暂停到 运行 ANALYZE 实际上会通知查询计划程序任何事情,因为此事务所做的更改尚未提交?

从逻辑上讲,假设客户正在做这样的事情:

BEGIN;

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

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

COMMIT;

ANALYZE 是否会对 运行ning 事务 的查询规划器有任何好处,还是它只会收集已提交行的统计信息?

ANALYZE 将看到先前在同一事务中所做的更改。但是只有同一个事务才会使用那些新收集的统计信息。其他事务将继续使用先前的统计信息(直到大型事务提交,然后它们将获取包含 now-committed 行的新统计信息)。