在 SQL 中使用多个连接时,将所有内容连接到表 A 或将表 A 连接到表 B、表 B 到表 C 等是不是更快? [复制]

Posted

技术标签:

【中文标题】在 SQL 中使用多个连接时,将所有内容连接到表 A 或将表 A 连接到表 B、表 B 到表 C 等是不是更快? [复制]【英文标题】:When using multiple joins in SQL, is it faster to join everything to table A , or join Table A to Table B, Table B to Table C, etc? [duplicate]在 SQL 中使用多个连接时,将所有内容连接到表 A 或将表 A 连接到表 B、表 B 到表 C 等是否更快? [复制] 【发布时间】:2015-09-19 02:31:43 【问题描述】:

为了帮助澄清,这里有一些代码:

方法一

SELECT * FROM tableA a  
JOIN tableB b ON a.id=b.id  
JOIN tableC c ON a.id=c.id   
JOIN tableD d ON a.id=d.id   

方法二

SELECT * FROM tableA a      
JOIN tableB b ON a.id=b.id  
JOIN tableC c ON b.id=c.id  
JOIN tableD d ON c.id=d.id  

【问题讨论】:

试一试并找出答案,但我怀疑它会产生很大的差异。我被告知在 WHERE 上加入两个条件会最快,但是使用 sqlserver,我认为无论如何在执行之前它都被编译成半等效的字节码。 感谢您的回答,但最后一部分是什么意思? 我的意思是,与 1980 年代不同,sql 指令没有被解释和严格遵循,而是被编译成低级代码,这些代码将执行您的指令要求的相同操作。这意味着不同的 sql 语句可以对数据库运行完全相同的代码。如果该翻译的优化部分掩盖了一种语法相对于另一种语法的任何性能优势,我不会感到惊讶。 @Kritner,Fabio,你SURE会有不同的结果吗?这些都是INNER JOINs INNER JOINS 既是关联的又是可交换的,即顺序无关紧要,这就是查询规划器可以决定最佳顺序的原因(在许多 RDBMS 中也是如此)。另见***.com/questions/9614922/… 【参考方案1】:

没有区别

请记住,数据库基于数学集合论。就集合论而言,这些连接是相等的。

因此,如果您查看实际的查询执行计划,您会发现 SQL Server 甚至正在重新组织连接,并且它可能会以完全不同的方式重新排列它们。

例如,如果一个表只包含 10 条记录,那么通常会将该表用于第一次连接,因为只删除 5 条记录,您已经可以减少整个结果集的 50%。

数据库正在维护一些关于记录数量和内容分布的统计信息。有了这些统计数据,查询引擎就可以很好地“猜测”哪个订单是最快的。

您可以通过使用查询提示来影响此行为,但这仅在极少数情况下有用。

【讨论】:

以上是关于在 SQL 中使用多个连接时,将所有内容连接到表 A 或将表 A 连接到表 B、表 B 到表 C 等是不是更快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

What Joins 用于将多个表连接到一个视图中

Informatica将多个连接的查询拆分到1个目标表的同一字段。

连接到SQL Server时OLEDB / ODBC驱动程序之间有什么区别?

通过sql server express将Android应用程序连接到sql server

每次我重新连接到 MySQL 数据库时,所有表都是空的

从一个连接到另一个表 SQL 的表中删除记录