Мне интересно, как получить лучшую производительность SQL, когда мы решаем, дублировать ли наши критерии, когда она уже есть в предложении Where.
Мой друг заявил, что это зависит от двигателей БД, но я не да, конечно.
Независимо от механизмов БД, обычно условие в предложении Where должно выполняться сначала перед соединением, но я предполагаю, что это означает внутреннее соединение, а не внешнее соединение. Поскольку некоторые условия могут быть выполнены только ПОСЛЕ внешнего соединения.
Например:
Select a.*, b.*
From A a
Left outer join B on a.id = b.id
Where b.id is NULL;
Условие в Where не может быть выполнено до внешнего соединения.
Итак, я предполагаю, что все предложение ON должно быть выполнено в первую очередь перед предложением where, и кажется, что предложение ON будет контролировать размер таблицы B (или таблицы A, если мы используем правое внешнее соединение) перед внешним соединением. Мне кажется, что это не связано с механизмами БД.
И это подняло мой вопрос: когда мы используем внешнее объединение, должны ли мы всегда дублировать наши критерии в предложении ON?
, например (я использую таблица к внешнему соединению с более короткой версией самого себя)
temp_series_installment & series_id> 18940000 vs temp_series_installment :
select sql_no_cache s.*, t.* from temp_series_installment s
left outer join temp_series_installment t on s.series_id = t.series_id and t.series_id > 18940000 and t.incomplete = 1
where t.incomplete = 1;
VS
select sql_no_cache s.*, t.* from temp_series_installment s
left outer join temp_series_installment t on s.series_id = t.series_id and t.series_id > 18940000
where t.incomplete = 1;
Редактировать : где t.incomplete = 1 выполняет лог c из: где t.series_id не нуль, что является внутренним объединением, предложенным Гордоном Линоффом. Но то, что я спрашивал это: если внешнее присоединение к меньшей таблице, это должно было быть быстрее, верно?
Я пытался увидеть, есть ли разница в производительности в mysql:
Но я не ожидал, почему второй быстрее? Я подумала, что при внешнем присоединении к меньшей таблице запрос будет быстрее.
Моя идея из: https://www.ibm.com/support/knowledgecenter/en/SSZLC2_8.0.0/com.ibm.commerce.developer.doc/refs/rsdperformanceworkspaces.htm
Раздел:
Pu sh предикаты в предложении OUTER JOIN, когда это возможно
Дублирование константного условия для разных таблиц, когда это возможно