让我们使用一个简单的"冗余"像这样查询。
SELECT * FROM
(SELECT * FROM
(SELECT * FROM mytable) AS X) AS Y
数据库引擎上是否有任何优化(在执行之前)收敛到最后一个而不会降低性能?什么数据库引擎这样做?
建议我提出真正的问题。并且可能对每个查询中的性能下注:)在这里......
SELECT * FROM t1 JOIN t2 ON t1.chkId = t2.xchkId;
和
SELECT * FROM
(SELECT * FROM t1) AS X
JOIN
(SELECT * FROM t2) AS Y
ON X.chkId = Y.xchkId;
当然我可以减少最后一个域(但现在不是这样)。 做同样的事!性能有何不同?
答案 0 :(得分:2)
答案 1 :(得分:2)
您正在谈论的数据库非常重要。
正如评论中所提到的,几乎每个合理的数据库都会忽略子查询并将查询编译为相同的底层代码。理解这一点的一个简单方法是SQL不是一种过程语言; SQL查询指定输出的结构,而不是如何生成。
通常,底层引擎是一个数据流引擎,它包含一组用于不同任务的算法,例如连接表,使用索引和聚合。执行的内容与SQL语句本身相差甚远。
所有这一切,并非所有数据库都是“合理的”。特别是,MySQL(以及因此MariaDB)实现了子查询。因此,结构确实不同。其他简单的数据库也可以这样做。
答案 2 :(得分:0)
有两个像您的示例一样组合的子查询是一种非常常见的sql模式。从概念上讲,每个子查询都是一个临时表。您会在查询计划中看到它显示为某种表运算符,如索引查找或扫描。
取决于子查询的复杂性: 1.使用像你的例子一样的子查询可能是最好的。 2.将子查询的结果放入实际的临时表或表变量中可能是最好的。
在您的问题中更加具体,并专注于查询计划是有帮助的。