Какой запрос более эффективен?

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

Обычно я ожидаю, что LOJ будет менее производительным, так как он должен выполнять всю работу INNER JOIN плюс дополнительную работу по расширению нуля результатов. Но если эта дополнительная работа не нужна, теоретически производительность должна быть такой же? Я попробовал это сам, но не заметил каких-либо постоянных различий, но хотел спросить здесь, чтобы быть уверенным.

2 ответа

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

Зачастую эффект внешнего объединения заключается в том, чтобы просто уменьшить выбор, который может сделать оптимизатор. Если это так, то, по сути, может использоваться тот же план запросов - и запросы идентичны

Конечно, эффект может быть гораздо более драматичным. Результирующий план запроса может быть намного хуже с внешним соединением.

Какая теория? Теория для обозначения не имеет ничего сказать о производительности. "Теория" для некоторой гипотетической реализации зависит от этой гипотетической реализации, которая может быть грубо разделена на логические (переписывание запросов) и как явные (индексы), так и неявные (другие) физические (реализации) аспекты. Реальность грубо руководствуется теми аспектами (гарантированными или иными) фактической реализации. В конечном итоге мы должны измерить предполагаемые / типичные / фактические нагрузки и данные - производительность хаотична, небольшое изменение обстоятельств может существенно изменить результаты.

Все это спорный вопрос, хотя, так как если вы объявляете ограничения и вы знаете, что внутренний и внешние соединения одинаковы, то СУБД весьма вероятно, также знают, и если нет, то весьма вероятно, сделать то же самое количество работы в любом случае.

Более того, разница будет незначительной по сравнению с тем, что делается на самом деле. Целые книги ждут оптимизации в целом и специально для СУБД.

Приведите аргументы в поддержку следующих гипотез:
• если n>=10, время, необходимое для инициализации матрицы, не очень важно
• если n<10, время, необходимое для инициализации матрицы, не очень важно
- Указывает на Ponder 1.1, Глава 1 (Введение), правило 1, "Пиши четко - не будь слишком умным", классика "Элементы стиля программирования", автор Kernihan & Plauger (1974)

Другие вопросы по тегам