Комментарии 14
А через что вы смотрите планы выполнения запросов ?
Нет, потому что чтение из вложенного запроса сохраняет порядок записей и так.
А оно точно сохраняет порядок? Всегда-всегда сохраняет? А если вложенных запросов несколько? А если там соединение вложенного запроса с таблицей?
Nested Loop, Hash Join, Merge Join
.Но вот если уже это соединение «обернуть» внешним запросом, то вот он — сохранит порядок. Правда, все тот же неопределенный.
Всё перечисленное вами не является частью семантики SQL.
Кстати, а если в условии WHERE написать подзапрос — сохранение порядка всё ещё гарантируется или уже нет?
WHERE добавляет к
Subquery Scan/CTE Scan/Function Scan/Values Scan
-узлу Filter-атрибут, поэтому порядок сохраняется. По крайней мере, пока не будет реализовано что-то маловероятное типа Parallel CTE Scan
.Ну нет, WHERE совершенно не обязательно добавляет что-то из перечисленного вами.
Вот запрос где получился Hash Join: https://explain.tensor.ru/archive/explain/504794ad1f08415afa2531efdb13ce50:0:2020-10-08#explain
А вот запрос где получился Nested Loop:
https://explain.tensor.ru/archive/explain/2477bb926f5102ef7cf9d38386975e09:0:2020-10-08
Кстати, на этих запросах видно, что порядок действительно сохранился, но вот построенный план… Чем больше я изучаю PostgreSQL — тем меньше я понимаю как его использовать.
А почему, собственно? Вроде бы оптимизация достаточно очевидная. Просто не дошли пока? Или есть какие-то краевые случаи, когда она некорректна, и их сложно отловить?
А если внутри запроса вызывается некоторая функция, результат которой зависит от порядка, например?.. Слишком много вариантов, когда самовольное устранение явно вписанной сортировки может навредить.
PostgreSQL Antipatterns: убираем медленные и ненужные сортировки