WAIT EVENT · IPC进程间
IPCHashBatchElect
等待选择一个并行哈希参与者来分配哈希表。
Waiting to elect a Parallel Hash participant to allocate a hash table
进程间 引入 11 现存至 20 devel 1 次变动 实测触发图谱档案
版本轨迹
相对 PostgreSQL 17 无变化。
各版本描述
相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。
-
1112
IPCHash/Batch/Electing曾用名选举一个并行哈希参与者来分配哈希表。
Electing a Parallel Hash participant to allocate a hash table.
-
1320
IPCHashBatchElect等待选择一个并行哈希参与者来分配哈希表。
Waiting to elect a Parallel Hash participant to allocate a hash table.
触发机制
WAIT_EVENT_HASH_BATCH_ELECT 位于 src/backend/executor/nodeHashjoin.c:1314,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:121。探针覆盖的操作是:等待选出一个负责分配哈希表的 Parallel Hash 参与者。HashBatchElect 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。
WAIT_EVENT_HASH_BATCH_ELECT at src/backend/executor/nodeHashjoin.c:1314 is the grep-verified reporting path. The public identity/resource is mapped at src/backend/utils/activity/wait_event_names.txt:121. The instrumented operation is: Waiting to elect a Parallel Hash participant to allocate a hash table. The HashBatchElect path has reached a process-coordination point and sleeps until a peer, worker, barrier, queue, or replication phase signals progress.
通常正常
只要所有参与者都在继续推进,短暂汇合就属正常。
Brief rendezvous is normal when every participant continues to advance.
值得警惕
同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。
Investigate when the same phase persists across three samples, the expected peer is absent or blocked, or a queue and its dependants stop moving.
诊断 SQL
直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。
正在等待 IPC/HashBatchElect 的会话Sessions waiting on IPC/HashBatchElect
PG ≥ 13SELECT pid, backend_type, usename, datname, application_name,
state, now() - query_start AS query_age,
now() - xact_start AS xact_age,
wait_event_type, wait_event,
pg_blocking_pids(pid) AS blocking_pids,
left(query, 160) AS query
FROM pg_stat_activity
WHERE wait_event_type = 'IPC'
AND wait_event = 'HashBatchElect'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布Current IPC cohort
PG ≥ 13SELECT wait_event, count(*) AS waiting_sessions,
count(*) FILTER (WHERE state = 'active') AS active_waiters,
max(now() - query_start) AS oldest_query
FROM pg_stat_activity
WHERE wait_event_type = 'IPC'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文Lock and relation context for these sessions
PG ≥ 13SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
d.datname, n.nspname, c.relname,
l.page, l.tuple, l.virtualxid, l.transactionid,
l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
ON c.oid = l.relation
AND l.database = (
SELECT oid FROM pg_database WHERE datname = current_database()
)
LEFT JOIN pg_namespace AS n ON n.oid = c.relnamespace
WHERE a.wait_event_type = 'IPC'
AND a.wait_event = 'HashBatchElect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;
处置步骤
- 确认事件所指的对端或阶段。
- 检查该参与者的等待、错误与进展状态。
- 修复停滞的参与者或上游依赖,不要把等待者当作根因。
英文原文
- Identify the peer or phase named by the event.
- Inspect that participant's wait, error, and progress state.
- Repair the stalled participant or upstream dependency instead of treating the waiter as the root cause.
相关参数与指标
waiting_sessionswait_event_share
源码证据
图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。
PostgreSQL 18REL_18_6
-
src/backend/executor/nodeHashjoin.c:1314WAIT_EVENT_HASH_BATCH_ELECT触发点实测触发WAIT_EVENT_HASH_BATCH_ELECT)) -
src/backend/utils/activity/wait_event_names.txt:121HASH_BATCH_ELECT目录定义实测触发HASH_BATCH_ELECT "Waiting to elect a Parallel Hash participant to allocate a hash table."
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。
-
PostgreSQL 13 ← 12 更名
更名
Hash/Batch/ElectingHashBatchElect描述措辞更新等待选择一个并行哈希参与者来分配哈希表。
描述前后对照
Electing a Parallel Hash participant to allocate a hash table. Waiting to elect a Parallel Hash participant to allocate a hash table. -
PostgreSQL 11 ← 10 新增此事件
该版起出现
选举一个并行哈希参与者来分配哈希表。
同类事件
| 事件 | 引入 | 版本变动 | 最近变动 |
|---|---|---|---|
AppendReady档案
|
14 | — | |
| 等待 Append 计划节点的子计划节点就绪。 | 现存 | ||
ArchiveCleanupCommand档案
|
15 | — | |
| 等待 archive_cleanup_command 完成。 | 现存 | ||
ArchiveCommand档案
|
15 | — | |
| 等待 archive_command 完成。 | 现存 | ||
BackendTermination档案
|
14 | — | |
| 等待另一个后端终止。 | 现存 | ||
BackupWaitWalArchive档案
|
13 | — | |
| 等待备份所需的 WAL 文件成功归档。 | 现存 | ||
BgworkerShutdown档案
|
10 | 171 次 | |
等待后台工作进程关闭。曾用名 BgWorkerShutdown |
现存 | ||
BgworkerStartup档案
|
10 | 171 次 | |
等待后台工作进程启动。曾用名 BgWorkerStartup |
现存 | ||
BtreePage档案
|
10 | — | |
| 等待继续并行 B-tree 扫描所需的页号可用。 | 现存 | ||
BufferIo档案
|
9.6起点 | 174 次 | |
等待缓冲区 I/O 完成。曾用名 BufferIO buffer_io |
现存 | ||
CheckpointDelayComplete档案
|
17 | — | |
| 等待后端解除对检查点完成的阻塞。 | 现存 | ||
CheckpointDelayStart档案
|
17 | — | |
| 等待后端解除对检查点启动的阻塞。 | 现存 | ||
CheckpointDone档案
|
12 | — | |
| 等待检查点完成。 | 现存 | ||
CheckpointStart档案
|
12 | — | |
| 等待检查点启动。 | 现存 | ||
ChecksumEnableStartcondition
|
19 | — | |
| 等待开始启用数据校验和。 | 现存 | ||
ChecksumEnableTemptableWait
|
19 | — | |
| 等待临时表被删除,以便启用数据校验和。 | 现存 | ||
ExecuteGather档案
|
10 | 131 次 | |
| 等待执行 Gather 计划节点时来自子进程的活动。 | 现存 | ||
HashBatchAllocate档案
|
11 | 131 次 | |
等待被选出的 Parallel Hash 参与者分配哈希表。曾用名 Hash/Batch/Allocating |
现存 | ||
HashBatchElect档案
|
11 | 131 次 | |
等待选出一个负责分配哈希表的 Parallel Hash 参与者。曾用名 Hash/Batch/Electing |
现存 | ||
HashBatchLoad档案
|
11 | 131 次 | |
等待其他 Parallel Hash 参与者完成哈希表加载。曾用名 Hash/Batch/Loading |
现存 | ||
HashBuildAllocate档案
|
11 | 131 次 | |
等待被选出的 Parallel Hash 参与者分配初始哈希表。曾用名 Hash/Build/Allocating |
现存 | ||
HashBuildElect档案
|
11 | 131 次 | |
等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。曾用名 Hash/Build/Electing |
现存 | ||
HashBuildHashInner档案
|
11 | 131 次 | |
等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。曾用名 Hash/Build/HashingInner |
现存 | ||
HashBuildHashOuter档案
|
11 | 131 次 | |
等待其他 Parallel Hash 参与者完成对 outer relation 的分区。曾用名 Hash/Build/HashingOuter |
现存 | ||
HashGrowBatchesDecide档案
|
11 | 131 次 | |
等待选出一个 Parallel Hash 参与者,以决定后续 batch 扩容。曾用名 Hash/GrowBatches/Deciding |
现存 | ||
HashGrowBatchesElect档案
|
11 | 131 次 | |
等待选出一个负责分配更多 batch 的 Parallel Hash 参与者。曾用名 Hash/GrowBatches/Electing |
现存 | ||
HashGrowBatchesFinish档案
|
11 | 131 次 | |
等待被选出的 Parallel Hash 参与者决定后续 batch 扩容。曾用名 Hash/GrowBatches/Finishing |
现存 | ||
HashGrowBatchesReallocate档案
|
11 | 162 次 | |
等待被选出的 Parallel Hash 参与者分配更多 batch。曾用名 Hash/GrowBatches/Allocating HashGrowBatchesAllocate |
现存 | ||
HashGrowBatchesRepartition档案
|
11 | 131 次 | |
等待其他 Parallel Hash 参与者完成重新分区。曾用名 Hash/GrowBatches/Repartitioning |
现存 | ||
HashGrowBucketsElect档案
|
11 | 131 次 | |
等待选出一个负责分配更多 bucket 的 Parallel Hash 参与者。曾用名 Hash/GrowBuckets/Electing |
现存 | ||
HashGrowBucketsReallocate档案
|
11 | 162 次 | |
等待被选出的 Parallel Hash 参与者完成更多 bucket 的分配。曾用名 Hash/GrowBuckets/Allocating HashGrowBucketsAllocate |
现存 | ||
HashGrowBucketsReinsert档案
|
11 | 131 次 | |
等待其他 Parallel Hash 参与者完成将元组插入新 bucket。曾用名 Hash/GrowBuckets/Reinserting |
现存 | ||
LogicalApplySendData档案
|
16 | — | |
| 等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。 | 现存 | ||
LogicalParallelApplyStateChange档案
|
16 | — | |
| 等待逻辑复制 parallel apply 进程改变状态。 | 现存 | ||
LogicalSyncData档案
|
10 | 131 次 | |
| 等待逻辑复制远端服务器发送用于初始表同步的数据。 | 现存 | ||
LogicalSyncStateChange档案
|
10 | 131 次 | |
| 等待逻辑复制远端服务器改变状态。 | 现存 | ||
MessageQueueInternal档案
|
10 | 131 次 | |
| 等待另一个进程附加到共享消息队列。 | 现存 | ||
MessageQueuePutMessage档案
|
10 | — | |
| 等待向共享消息队列写入协议消息。 | 现存 | ||
MessageQueueReceive档案
|
10 | — | |
| 等待从共享消息队列接收字节。 | 现存 | ||
MessageQueueSend档案
|
10 | — | |
| 等待向共享消息队列发送字节。 | 现存 | ||
MultixactCreation档案
|
17 | — | |
| 等待 multixact 创建完成。 | 现存 | ||
ParallelBitmapScan档案
|
10 | — | |
| 等待并行位图扫描完成初始化。 | 现存 | ||
ParallelCreateIndexScan档案
|
11 | — | |
| 等待并行 CREATE INDEX 工作进程完成 heap 扫描。 | 现存 | ||
ParallelFinish档案
|
10 | — | |
| 等待并行工作进程完成计算。 | 现存 | ||
ProcarrayGroupUpdate档案
|
10 | 172 次 | |
等待 group leader 在事务结束时清除事务 ID。曾用名 ProcArrayGroupUpdate |
现存 | ||
ProcSignalBarrier档案
|
13 | — | |
| 等待所有后端处理完 barrier 事件。 | 现存 | ||
Promote档案
|
12 | — | |
| 等待备库提升。 | 现存 | ||
RecoveryConflictSnapshot档案
|
13 | — | |
| 等待解决与 vacuum cleanup 有关的恢复冲突。 | 现存 | ||
RecoveryConflictTablespace档案
|
13 | — | |
| 等待解决与删除表空间有关的恢复冲突。 | 现存 | ||
RecoveryEndCommand档案
|
15 | — | |
| 等待 recovery_end_command 完成。 | 现存 | ||
RecoveryPause档案
|
13 | — | |
| 等待恢复操作继续执行。 | 现存 | ||
RepackWorkerExport
|
19 | — | |
| 等待解码工作进程导出新的输出文件。 | 现存 | ||
ReplicationOriginDrop档案
|
10 | 131 次 | |
| 等待复制源变为非活动状态,以便将其删除。 | 现存 | ||
ReplicationSlotDrop档案
|
10 | 131 次 | |
| 等待复制槽变为非活动状态,以便将其删除。 | 现存 | ||
RestoreCommand档案
|
15 | — | |
| 等待 restore_command 完成。 | 现存 | ||
SafeSnapshot档案
|
10 | 131 次 | |
| 等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。 | 现存 | ||
SyncRep档案
|
10 | 131 次 | |
| 等待同步复制期间来自远端服务器的确认。 | 现存 | ||
WaitForWalFlush
|
19 | — | |
| 等待主服务器或备用服务器上的 WAL 刷盘达到目标 LSN。 | 现存 | ||
WaitForWalReplay
|
19 | — | |
| 等待备用服务器上的 WAL 重放达到目标 LSN。 | 现存 | ||
WaitForWalWrite
|
19 | — | |
| 等待备用服务器上的 WAL 写入达到目标 LSN。 | 现存 | ||
WalReceiverExit档案
|
14 | — | |
| 等待 WAL receiver 退出。 | 现存 | ||
WalReceiverUpstreamCatchup档案
|
17 | — | |
| 等待上游服务器的 WAL flush 位置追上请求的起始点。 | 现存 | ||
WalReceiverWaitStart档案
|
10 | 141 次 | |
| 等待 startup 进程发送流复制的初始数据。 | 现存 | ||
WalSummaryReady档案
|
17 | — | |
| 等待生成新的 WAL summary。 | 现存 | ||
XactGroupUpdate档案
|
11 | 131 次 | |
等待 group leader 在事务结束时更新事务状态。曾用名 ClogGroupUpdate |
现存 | ||