gpt4 book ai didi

多个表的 SQL INNER JOIN 等于 WHERE 语法

转载 作者:行者123 更新时间:2023-11-29 13:29:19 25 4
gpt4 key购买 nike

我有两个连接多个表的 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 毫秒内处理。

最佳答案

在尝试优化连接顺序时,查询规划器以(几乎)相同的方式考虑所有 WHEREJOIN 谓词。您获得相同的性能也就不足为奇了。 Per documentation:

Explicit inner join syntax (INNER JOIN, CROSS JOIN, or unadorned JOIN) is semantically the same as listing the input relations in FROM, so it does not constrain the join order.

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

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

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

另请注意,OUTER 联接的行为有所不同,因为由于逻辑含义,它们不能由查询计划程序自由地重新排列。

关于多个表的 SQL INNER JOIN 等于 WHERE 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com