ПРИСОЕДИНЯЙТЕСЬ, только если логическое значение истинно - PullRequest
0 голосов
/ 17 июня 2020

Есть ли способ намекнуть на Postgres, что он должен пытаться выполнить поиск JOIN, только если установлен in_table_b? Это чистая оптимизация производительности и не повлияет на результаты. поиск индекса на B, если in_table_b ложно. Однако я хочу вернуть строки в A, даже если в B нет соответствующей строки.

1 Ответ

4 голосов
/ 17 июня 2020

Вы не можете (и вообще не должны пытаться) контролировать то, как база данных выполняет запрос. SQL - это описательный язык: вы сообщаете базе данных желаемые результаты и доверяете ей принятие наилучшего решения с точки зрения плана выполнения - разработчики баз данных приложили много усилий для создания механизмов, которые наилучшая возможная стратегия.

Я бы просто добавил еще одно условие в предложение on в left join; это самый простой способ express того, что вы хотите:

select a.id, a.in_table_b, b.foobar 
from a 
left join b on a.id = b.id and a.in_table_b;

Я бы порекомендовал индекс для a(in_table_b, id): это может каким-то образом намекнуть планировщику запросов, как действовать (порядок столбцов в здесь важен индекс). Однако можно также подумать, что логический столбец - не очень хороший выбор, потому что количество элементов не очень хорошее (есть только два возможных значения). База данных может по-прежнему go для поиска по индексу - и на самом деле, это вполне может быть наиболее эффективным вариантом.

...