Имеет ли значение порядок объединения в sql? - PullRequest
0 голосов
/ 25 июля 2011

Я использую postgresql, предположим, у меня две таблицы, одна из которых - user (name, age, comment_id), а другая - comment (comment_id, text), сейчас миллиард пользователей, но тысячи комментариев. Имеет ли значение порядок, в котором объединяются записи, где пункт имеет значение?

Пример: запрос 1

select a.name, b.text 
from user as a, comment as b
where 
   b.comment_id = 1 and
   a.comment_id = b.comment_id

Пример: Запрос 2

select a.name, b.text 
from user as a, comment as b
where 
  a.comment_id = b.comment_id and
  b.comment_id = 1

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

Порядок соединений не имеет значения для внутренних объединений, но имеет значение для внешних объединений.

0 голосов
/ 25 июля 2011

Порядок присоединения не имеет значения, пока вы не достигнете пороговых значений.Один порог вызывает включение Geqo, два других - когда явное и неявное объединение слишком велико.

В предложении where порядок не имеет значения, и PG оставляет за собой право переупорядочить все на основе логическогологика.Это делает этот запрос опасным:

select 1 from stuff where x <> 0 and y / x > 1 -- should use case instead
0 голосов
/ 25 июля 2011

Насколько я читаю ваш код, вы вообще не используете соединение.Вы создаете целое декартово произведение, а затем фильтруете ГДЕ.Будем надеяться, что ваш оптимизатор запросов позаботится об этом.

И да, это имеет значение.Всегда сначала старайтесь делать более избирательно (что убивает больше строк из декартового произведения) и посмотрите на QEP вашей СУБД.

Ваш запрос должен выглядеть примерно так:

select a.name, b.text from
user as a
[left|right|inner|outer] join comment as b on a.comment_id = b.comment_id
where b.comment_id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...