我有两个连接多个表的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内处理完毕。
当试图优化连接顺序时,查询计划者将(几乎)以相同的方式考虑所有WHERE
和JOIN
谓词。获得相同的性能也就不足为奇了。每个文档:
显式内部联接语法(
INNER JOIN
,CROSS JOIN
或unadorned
JOIN
)在语义上与列出中的输入关系相同FROM
,因此它不限制联接顺序。
唯一的区别是:当表的总数大于的设置时,显式联接语法指示给定的联接顺序join_collapse_limit
。
显式JOIN
s绑定在FROM
列表中的逗号之前,这与允许的语法有关。例子。
无论如何,FROM
子句中 以 逗号分隔的表列表 绝不被弃用 。这是一种 很好的形式, 并且使用显式联接语法 更具可读性
。
还要注意,OUTER
联接的行为有所不同,因为逻辑上的影响,查询计划人员无法随意重新排列联接。
问题内容: 案件: 如何从相等的地方更新数据? 问题: 当我运行以下更新语句时,它将更新中的所有记录(即使中的字段不存在)。 我如何使用的多个更新表的语法,在仅更新记录只有在存在于和平等的吗? 提前致谢。 问题答案: 这是with join in 的正确语法 SQLFiddle演示
我正在尝试从技能作业表中删除一行 以下是我的疑问 但它抛出以下错误; 致命错误:未捕获的异常'异常'消息'您有一个错误在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确的语法使用附近'skj内连接作业j上<--plhd--0/<--#############################################################################
问题内容: 在为我的sql动态生成子句时,我喜欢将代码硬编码到sql中,因此不必跟踪是否在每个后面的子句之前添加前缀。这在很多地方都有很好的文档证明,例如stackoverflow问题。 是否存在用于动态生成语句子句的等效模式?我宁愿跟踪是否需要加逗号。如果没有通用的解决方案,这将用于通过jdbc与oracle数据库进行交互。 编辑对于我的特定用例,我将需要动态地更改要设置的列。因此,任何需要查询
问题内容: 所以我想做的是:- 相当奇怪的查询,我知道!但是我正在尝试在EntityFramework / Linq中复制此代码- 查看所有示例,当联接使用AND(使用匿名类型)但对OR联接存在相同的结果时,我可以看到一种非常简单的方法? 问题答案: 只需使用where子句进行交叉连接 令人怀疑的是,连接条件或连接条件是否会比此条件更有效,但是可能会导致相同的执行计划。除了性能,它还会产生相同的结
问题内容: 我可以在C#中做到这一点: 例如在Java中 我如何查询这样的ArrayList?谢谢。 问题答案: Java 8引入了Stream API ,该API允许与Linq中的构造类似的构造。 例如,您的查询可以表示为: 如果存在默认值,您显然需要锻炼,在这种情况下,这似乎很奇怪,但是我已经展示了它,因为这就是您问题中的代码所做的。
问题内容: 假设有人来找您,并说我们将通过用equals替换equals来减少我们编写的SQL数量。既可以用于单个标量值,也可以用于数字列表。 或者 这些语句等于优化器产生的内容吗? 从表面上看,这看起来确实很简单,但是由于两个原因,它导致了简化:1.不需要复制大型SQL块;并且2.我们不会过度使用动态SQL。 这是一个人为的示例,但请考虑以下内容。 …对于不止一种情况,同样如此 (这甚至不是一个