如果我要在两个表之间进行连接,那么就我作为一个整体加入它们的事实会有什么不同,或者我在仅提取了所需的列之后加入了它们(假设每个表都可能有很多专栏)?
例如,是
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
服务表现明智?
答案 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花了两分钟。所以它产生了很大的影响。