PostgreSQL中为何CTE与临时表的扫描操作被限制并行执行?
引自PostgreSQL官方手册:
以下操作始终为并行限制状态:
- 公共表表达式(CTE)的扫描操作
- 临时表的扫描操作
两类操作被限制并行扫描的具体技术原因如下:
临时表扫描受限原因
PostgreSQL的临时表是会话级私有对象,它的所有元数据、存储数据都仅保存在当前会话的私有内存以及专属临时文件中,完全不会同步到全局共享内存或公共存储区域。而并行查询的工作进程是独立于主会话的独立后端进程,既没有权限也没有访问路径可以读取主会话的私有内存和专属临时文件,强行开启并行扫描只会出现数据找不到、进程上下文错乱的问题,属于设计层面的固有并行限制。
CTE扫描受限原因
PostgreSQL对CTE默认采用「一次物化、多次复用」的执行逻辑:查询执行时会先完整计算出CTE的结果,将其物化到临时内存或磁盘结构中,后续所有引用该CTE的执行节点都会直接读取这个已物化的结果集。而并行扫描要求底层数据集可以被拆分为多个互不重叠的分片,分配给不同工作进程独立读取。已物化的CTE结果集既没有提前做并行分片标记,也没有实现多进程并发读取的偏移控制逻辑,多个工作进程同时访问很容易出现重复读、漏读的问题,因此官方直接将CTE扫描标记为并行受限操作。
内容的提问来源于stack exchange,提问作者Gregory Arenius
相关产品推荐
相关产品推荐

