Мне было интересно, что быстрее - объединение нескольких выборок в один выбор соединения или фактическое выполнение отдельных выборок быстрее?
Я выполняю задачу, в которой есть много таблиц (в настоящее время 4, но, вероятно, они увеличиваются), связанных друг с другом, и я выбираю их с помощью LEFT JOIN. Получат ли такие sql-запросы к postgresql крайность?
Что думаете по своему опыту :)
Вообще говоря, подготовка каждого запроса и получение данных связаны с расходами. Для небольших наборов данных выполнение SELECT в цикле не так уж и плохо, но если вы выполняете SELECT для таблицы с 1000 строками, то для каждой из этих строк, выполняющей еще один SELECT в другой таблице с 1000 строками, разница будет быть очень заметным, даже если зацикленные выборки выполняются из заранее подготовленного запроса.
Даже если стоимость подготовки каждого запроса в цикле равна нулю, возможно, что элементы JOINed уменьшат общий размер извлекаемых данных. Например, если вы присоединяете свою таблицу из 1000 строк к таблице только с одной совпадающей строкой, версия запроса JOIN вернет одну строку, в то время как отдельные команды SELECT вернут 1000 строк из первой таблицы, а цикл даст 999 строк. пустые наборы и 1 ряд.
Если вы запрашиваете один конкретный элемент из каждой таблицы, а не перебираете набор строк, то разница между одним «большим» запросом и 4 маленькими запросами, вероятно, ничтожна. Как сказал voretaq7, получение postgresql для EXPLAIN того, что будет делать каждый запрос и сколько времени это займет, будет иметь большое значение для выяснения того, что именно произойдет.
Ответ: «Это зависит от вашей базы данных», хотя обычно запрос пишется как JOIN
предпочтительнее, так как его легче читать и дает планировщику запросов некоторые подсказки относительно того, что вы делаете /
Вы должны попросить Postgres EXPLAIN
(или EXPLAIN ANALYZE
) план запроса для вашего запроса и посмотрите, есть ли какие-либо существенные отличия - в то же время вы также можете обнаружить некоторые другие вещи, которые вы можете оптимизировать, например индексирование. Видеть руководство Postgres для получения дополнительной информации об использовании EXPLAIN
.