1

如果我要在两个表之间进行连接,那么对于我将它们作为一个整体加入的事实会有什么不同,或者我在仅提取所需的列之后加入它们(假设每个表可能有很多列)?

例如,是

SELECT tableA.foreignKey, tableB.someValue
FROM tableA JOIN tableB ON tableA.foreignKey=tableB.key

有什么不同

SELECT tableA.foreignKey, tableB.someValue 
FROM (SELECT foreignKey FROM tableA) tableA_filtered 
JOIN (SELECT key, someValue FROM tableB) tableB_filtered 
ON tableA_filtered.foreignKey=tableB_filtered.key

性能方面?

4

3 回答 3

1

使用第一个,因为第二个使用为结果创建临时表的子查询。实际上(SELECT valueA FROM tableA)根本没有任何意义,因为您没有聚合表上的某些列。

子查询有时是邪恶的,并非总是如此。Tt 取决于您使用的 RDBMS。

于 2013-03-12T12:32:12.823 回答
1

一般规则是子查询总是很慢。根据您正在处理的数据量,它可能会产生很大的影响。

Reciently 我从一个带有很多连接的大型选择中删除了一个子查询。SQL 正在处理大约 100,000 行,如果不是更多的话。删除非常简单的子选择将性能提高了 50 秒。总体而言,sql 需要两分钟。所以影响很大。

于 2013-03-12T12:52:07.143 回答
0

我认为在表有很多列的情况下,第二个查询可能会更快。但重要的是要注意这两个查询是不等价的。第一个显示来自 A 和 B 的所有值,第二个仅显示来自 A 的 valueA 和来自 B 的 valueB!无论如何,它更像是一个理论问题,一般很难回答。

实际上,我会将这个决定留给数据库优化器。但是如果你想真正知道是否有办法让它更快,唯一安全的方法是测量和比较两个查询的运行时间。

作为旁注,第二个查询很可能会被 DBMS 的重写引擎弄平,所以它和你写的时候一样:

从 A、B 中选择 valueA、valueB,其中 A.valueA = B.valueB;

于 2013-03-12T12:44:19.233 回答