лучше делать с джоинами в целом и не парится, но если явно видно, что подзапрос будет лучше или без него не обойтись, то нужно применять его, да ?
Чаще всё-таки применяются JOIN-ы, мне кажется. Если кажется, что подзапрос будет лучше, то можно подумать, не придётся ли потом переделывать его в JOIN (насколько вероятно, что придётся возвращать не одно значение, а несколько; или несколько записей)? > или без него не обойтись Да уж обойтись-то можно почти всегда.
(SELECT ... ORDER BY xxx LIMIT 1) эффективно пока что не заменить примерно никак.
А перед может быть написано [LEFT|CROSS] JOIN LATERAL — это JOIN или подзапрос? ;) > эффективно пока что не заменить примерно никак. Нередко можно заменить CTE+ROW_NUMBER() или DISTINCT ON — и это может быть даже эффективнее (зависит от распределения/количества значений).
да. Джойны тогда, когда ты надеешься на внутренние алгоритмы слияния, подзапросы - когда контролируешь это руками. Иногда это более эффективно, и семантически проще, но далеко не всегда.
> когда ты надеешься на внутренние алгоритмы слияния, Хмм... о чём речь? > подзапросы - когда контролируешь это руками Большинству современных планировщиков/оптимизаторов запросов на такой "контроль" как-то... (они всё равно преобразуют подзапросы в JOIN в большинстве случаев, если это вообще возможно).
только в тех случаях, когда действительно можно обойтись слиянием. Это касается большинства запросов, но не всех, особенно тех что не после where.
Ну так об этом и речь — в большинстве случаев subquery pullup будет выполнен, т.о. "контролировать" план таким образом не получится.
Обсуждают сегодня