Сравнение производительности с postgresql: левое соединение против объединения всех

Я хочу знать, что является лучшим и самым быстрым решением между «левым внешним соединением» и «объединением всех». База данных представляет собой PostgreSQL.

Запрос с UNION ALL :

SELECT * FROM element, user WHERE elm_usr_id = usr_id
UNION ALL
SELECT * FROM element WHERE elm_usr_id ISNULL;

Запрос с ЛЕВЫМ ВНЕШНИМ СОЕДИНЕНИЕМ:

SELECT * FROM element LEFT OUTER JOIN user ON elm_usr_id = usr_id;

person GuillaumeS    schedule 14.09.2012    source источник


Ответы (3)


Ваши два запроса могут не дать одинаковый результат.

Ваш запрос с UNION ALL возвращает совпадающие строки, а также строки, которые не совпадают из-за нулевого значения в elm_usr_id.

В то время как запрос с LEFT JOIN (то же, что и LEFT OUTER JOIN) возвращает совпадающие строки, а также строки, которые не совпадают из-за какого-либо несоответствующего значения.

В связи с этим запрос с LEFT JOIN более безопасен, если вы ожидаете увидеть все строки.

Вернемся к вашему первоначальному вопросу: запрос с LEFT JOIN лучше всего подходит для использования индексов. Например, если вы хотите получить отсортированный результат, то запрос UNION будет намного медленнее. Или, если ваш запрос является подзапросом в основном запросе, то UNION предотвратит любое возможное использование индексов таблицы [элемента]. Таким образом, выполнение JOIN или WHERE такого подзапроса будет медленным.

person Skrol29    schedule 14.09.2012

Я бы предложил LEFT OUTER JOIN вместо объединения всех в этом конкретном сценарии,

так как в union all вы должны прочитать таблицы дважды, тогда как в LEFT OUTER JOIN только один раз

person Joe G Joseph    schedule 14.09.2012

Вероятно, LEFT JOIN, но вы можете увидеть план запроса, запустив EXPLAIN ANALYSE SELECT.... Форма UNION ALL может быть более понятной, если вы изменяете столбцы на основе нулевого значения elm_usr_id, но вы всегда можете использовать CASE для изменения столбцов с помощью LEFT JOIN.

person Richard Huxton    schedule 14.09.2012