SQL INNER JOIN多个表等于WHERE语法

时间:2014-12-11 08:43:00

标签: sql postgresql join

我有两个连接多个表的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'

所有查询都在2ms内处理。

1 个答案:

答案 0 :(得分:1)

在尝试优化连接顺序时,查询规划器会以(几乎)相同的方式考虑所有WHEREJOIN谓词。你获得相同的表现并不奇怪。 Per documentation:

  

明确的内部联接语法(INNER JOINCROSS JOIN或简单的JOIN)   在语义上与列出FROM中的输入关系相同,所以它   不限制连接顺序。

唯一的区别:当表的总数大于join_collapse_limit的设置时,显式连接语法指示给定的连接顺序。

显式JOIN绑定在FROM列表中的逗号之前,这与允许的语法相关。 Example.

在任何情况下,FROM子句中以逗号分隔的表格列表都不会弃用 。它只是良好的形式,而且更具可读性来使用显式连接语法。

另请注意,OUTER联接的行为方式不同,因为逻辑含义,查询计划程序无法自由重新排列它们。