是否有一种方法可以向Postgres提示,如果设置了in_table_b
,它应该仅尝试执行JOIN查找?这纯粹是性能优化,不会改变结果。
Table A:
id Serial
in_table_b Boolean
Table B:
id Int (Foreign Key A.id)
foobar Text
当前查询:
SELECT A.id, A.in_table_b, B.foobar FROM A LEFT JOIN B ON a.id = B.id;
我想要一个有效地声明的子句:如果in_table_b
为假,请不要尝试对B进行索引查找。但是,即使B中没有匹配的行,我也想返回A中的行。
答案 0 :(得分:4)
您不能真正地(而且通常不应尝试)控制数据库执行查询的方式。 SQL是一种描述性语言:您将所需的结果告诉数据库,并相信它可以在执行计划方面做出最佳决策-数据库设计人员在构建引擎方面投入了大量精力,以找出解决方案。最佳策略。
我只会在on
的{{1}}子句中添加另一个条件;这是表达您想要的最简单的方法:
left join
我会建议在select a.id, a.in_table_b, b.foobar
from a
left join b on a.id = b.id and a.in_table_b;
上建立索引:这可能会以某种方式提示查询计划程序如何进行操作(索引中列的顺序在此很重要)。但是,它也可能认为布尔列不是一个很好的选择,因为基数不好(只有两个可能的值)。数据库可能仍会去查找索引-实际上,这很可能是最有效的选择。