PostgreSQL视图与同逻辑子查询执行时间差异原因排查
Append节点的额外遍历开销
视图基于4张表的UNION ALL构建,执行查询时会触发Append节点遍历所有子表。即使你指定了type='CUSTOMER',数据库仍会对每张表执行type条件检查——哪怕单表内type值固定。虽然(type, row_id)索引能快速过滤不匹配的表,但每张表的索引查找、条件判断都会累积额外的CPU和IO开销;而直接查询目标单表时,完全跳过了对其他3张表的扫描准备与过滤步骤。统计信息未识别单表type的唯一性
每张表的type是固定生成列,但如果数据库统计信息没有标记该列在单表内的唯一性,优化器无法在视图查询阶段提前排除无关表。以PostgreSQL为例,默认会生成Append + Filter的执行计划,只有当优化器能确定某张表的type不可能匹配查询条件时,才会跳过该表。若统计信息缺失这一关键信息,优化器只能逐个检查所有子表,带来不必要的开销。生成列的条件下推效率差异
虽然(type, row_id)索引存在,但视图查询中,优化器对type条件的下推逻辑不如直接查单表高效。直接查询单表时,优化器可直接将type='CUSTOMER'作为索引的前置过滤条件,快速定位数据;而视图查询中,条件需要先经过Append节点分发到各子表后再应用,多了一层分发逻辑的开销。并行执行的资源调度浪费
查询视图时,数据库可能为所有4张子表分配并行工作进程,即便只有一张表有匹配数据,多余的进程调度、上下文切换会消耗系统资源。直接查询单表时,并行资源会集中在目标表,调度更高效,避免了无效的资源分配。
内容的提问来源于stack exchange,提问作者Han Tran

