使用较少的列来加入整个表与JOIN表(通过子查询获取)

时间:2013-03-12 12:29:37

标签: sql performance join

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

例如,是

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

服务表现明智?

3 个答案:

答案 0 :(得分:1)

使用第一个,因为第二个使用子查询为结果创建临时表。实际上(SELECT valueA FROM tableA)完全没有意义,因为你没有在表格上聚集一些列。

子查询有时是邪恶的,根本不是。 Tt取决于您使用的RDBMS。

答案 1 :(得分:0)

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

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

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

SELECT valueA,valueB FROM A,B WHERE A.valueA = B.valueB;

答案 2 :(得分:0)

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

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