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 Объединения ведут себя по-разному в том смысле, что планировщик запросов не может их так легко перегруппировать из-за логических последствий.

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