YugabyteDB 4表关联查询MergeJoin提示未生效问题咨询
问题原因
你的提示完全没有被pg_hint_plan解析,和优化器成本选择无关,核心是语法写错了:
- pg_hint_plan的提示块有严格的格式要求,必须以
/*+作为注释开头,你写的是/**,缺少了关键的+标识符,整个注释块会被数据库当成普通注释直接跳过,里面写的work_mem设置、4条MergeJoin提示根本不会被读取处理。 - 就算修正了注释格式,只写MergeJoin提示也不一定生效:MergeJoin要求关联两侧的输入在关联键上是有序的,你当前执行计划里走主键索引的Nested Loop单条匹配成本仅0.11,优化器计算成本时会默认这个方案比给多表排序后做MergeJoin开销低很多,除非你同时指定连接顺序、必要的扫描方式提示,才会稳定出MergeJoin计划。
修正后的参考写法
SET pg_hint_plan.enable_hint=ON; /*+ Set(work_mem "4000MB") Leading(self_0 (self_1 (self_2 (self_3 self_4)))) MergeJoin(self_0 self_1) MergeJoin(self_0 self_2) MergeJoin(self_0 self_3) MergeJoin(self_0 self_4) */ EXPLAIN SELECT count(*) FROM self_0 inner join self_1 on self_0.k = self_1.k inner join self_2 on self_0.k = self_2.k inner join self_3 on self_0.k = self_3.k inner join self_4 on self_0.k = self_4.k;
如果修正后还是没有生成MergeJoin计划,可以额外增加SeqScan提示强制对应表走顺序扫描,或者通过Rows提示给优化器传递准确的行数预估,避免优化器因为低估Nested Loop成本选错计划。
内容的提问来源于stack exchange,提问作者FranckPachot
相关产品推荐
相关产品推荐

