仅在布尔值为true时加入

时间:2020-06-16 23:08:19

标签: sql postgresql join select query-optimization

是否有一种方法可以向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中的行。

1 个答案:

答案 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; 上建立索引:这可能会以某种方式提示查询计划程序如何进行操作(索引中列的顺序在此很重要)。但是,它也可能认为布尔列不是一个很好的选择,因为基数不好(只有两个可能的值)。数据库可能仍会去查找索引-实际上,这很可能是最有效的选择。