SQL INNER JOIN для нескольких таблиц, равных синтаксису WHERE
У меня есть два запроса PostgreSQL, которые соединяют несколько таблиц:
Первый:
SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name
FROM
service_iradio_table AS iradio,
genre_table AS genre,
genre_name_table AS genre_name,
genre_name_translation_table AS genre_trans,
genre_mapping_table AS genre_mapping,
language_code_table AS code
WHERE
iradio.id=genre_mapping.s_id AND genre_mapping.g_id=genre.id AND genre.id=genre_name.g_id
AND genre_name.t_id=genre_trans.id AND genre_trans.code_id=code.id AND iradio.name='MyRadio' AND code.language_iso_code='ger'
Во-вторых:
SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name
FROM
service_iradio_table AS iradio INNER JOIN genre_mapping_table AS genre_mapping ON iradio.id=genre_mapping.s_id
INNER JOIN genre_table AS genre ON genre_mapping.g_id=genre.id
INNER JOIN genre_name_table AS genre_name ON genre.id=genre_name.g_id
INNER JOIN genre_name_translation_table AS genre_trans ON genre_name.t_id=genre_trans.id
INNER JOIN language_code_table AS code ON genre_trans.code_id=code.id
WHERE iradio.name='MyRadio' AND code.language_iso_code='ger'
Исходя из MySQL, я подумал, что первый запрос должен быть медленнее, чем второй из-за перекрестных ссылок на каждую таблицу.
Похоже, что в postgreSQL оба запроса внутренне совпадают. С ключевым словом "EXPLAIN" для двух запросов вывод одинаков.
Вопрос
Правда ли, что эти запросы "равны"? Вообще ли это дизайн Goog для объединения таблиц таким образом?
В конце также эта попытка настройки производительности запускается в тот же вывод с "EXPLAIN":
SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name
FROM
service_iradio_table AS iradio INNER JOIN genre_mapping_table AS genre_mapping ON iradio.id=genre_mapping.s_id AND iradio.name='MyRadio',
genre_table AS genre,
genre_name_table AS genre_name,
genre_name_translation_table AS genre_trans,
language_code_table AS code
WHERE
genre_mapping.g_id=genre.id AND genre.id=genre_name.g_id
AND genre_name.t_id=genre_trans.id AND genre_trans.code_id=code.id AND code.language_iso_code='ger'
Все запросы обрабатываются в течение 2 мс.
1 ответ
Планировщик запросов принимает все WHERE
а также JOIN
предикаты учитываются (почти) одинаково при попытке оптимизировать порядок соединения. Не удивительно, что вы получаете такую же производительность. По документации:
Явный синтаксис внутреннего соединения (
INNER JOIN
,CROSS JOIN
или без украшенийJOIN
) семантически совпадает с перечислением входных отношений вFROM
так что это не ограничивает порядок соединения.
Единственное отличие: явный синтаксис объединения указывает заданный порядок соединений, когда общее количество таблиц больше, чем значение для join_collapse_limit
,
И явный JOIN
привязать перед запятыми в FROM
список, который имеет отношение к допустимому синтаксису. Пример.
В любом случае, разделенные запятыми списки таблиц в FROM
пункт ни в коем случае не является устаревшим. Это просто хорошая форма и намного удобнее читать с использованием явного синтаксиса соединения.
Также обратите внимание, что OUTER
Объединения ведут себя по-разному в том смысле, что планировщик запросов не может их так легко перегруппировать из-за логических последствий.