PostgreSQL中两种JOIN查询哪个更快?函数参数VS父表字段关联
两个PostgreSQL LEFT JOIN查询的性能对比分析
现有父表TABLE_A(含a、b、c字段)与表TABLE_B(含a、b、d字段),需判断以下两个关联查询的性能差异。已知:TABLE_A与TABLE_B的a、b字段均已建立索引,且查询中使用的$1、$2是函数内恒定不变的参数值。
待对比查询
QUERY 1
SELECT * FROM TABLE_A as ta LEFT JOIN TABLE_B as tb ON tb.a = ta.a and tb.b = ta.b WHERE ta.a = $1 and ta.b = $2
QUERY 2
SELECT * FROM TABLE_A as ta LEFT JOIN TABLE_B as tb ON tb.a = $1 and tb.b = $2 WHERE ta.a = $1 and ta.b = $2
性能分析
两个查询的返回结果完全一致,但执行逻辑存在差异,性能表现分两种场景:
场景1:TABLE_A中符合a=$1、b=$2的结果仅1行
此时两个查询的性能基本无差异。PostgreSQL优化器会通过常量传播优化,将QUERY 1中tb.a = ta.a的条件替换为tb.a = $1(同理tb.b = $2),最终生成与QUERY 2完全相同的执行计划:
- 利用
TABLE_A的a、b索引快速定位目标行; - 利用
TABLE_B的a、b索引一次性查找匹配($1,$2)的行; - 完成LEFT JOIN关联。
场景2:TABLE_A中符合a=$1、b=$2的结果有多行
QUERY 2的性能明显更优:
QUERY 2会先通过TABLE_B的索引一次性查出所有匹配($1,$2)的行,再与TABLE_A的结果集做关联,仅需1次TABLE_B查询;QUERY 1会对TABLE_A的每一行重复执行一次TABLE_B的索引查找(尽管每次查找的条件都是($1,$2)),重复的查找操作会带来额外的性能开销。
结论
- 单结果行场景:两者性能一致;
- 多结果行场景:优先选择
QUERY 2,避免重复查询带来的损耗。
内容的提问来源于stack exchange,提问作者Karan Raj
相关产品推荐
相关产品推荐

