什么时候应该使用 INNER -LOOP- JOIN 而不是 INNER JOIN

Posted

技术标签:

【中文标题】什么时候应该使用 INNER -LOOP- JOIN 而不是 INNER JOIN【英文标题】:When should I use an INNER -LOOP- JOIN instead of an INNER JOIN 【发布时间】:2011-09-25 14:56:18 【问题描述】:

今天我在 SQL Server 中了解到一个叫做 INNER LOOP JOIN 的东西。

这是什么意思? (谷歌没有帮助......或者我应该说......关于它的博客文章有点......技术性并且让我大吃一惊)。

此外,在哪些常见情况下使用INNER LOOP JOIN 而非标准INNER JOIN 是个好主意?

【问题讨论】:

【参考方案1】:

循环 |哈希 | MERGE 是联接提示,指定查询中的联接应使用循环、散列或合并。使用循环 |HASH | MERGE JOIN 强制两个表之间的特定连接。 LOOP 不能与 RIGHT 或 FULL 一起指定为连接类型。

您应该始终使用 INNER JOIN。让查询优化器决定是否要执行 LOOP、MERGE 或 HASH 连接。在几乎所有情况下,优化器都会做出更好的判断。将使用哪一个以及何时可以从我的演示文稿http://sqlbits.com/Sessions/Event4/Understanding_Graphical_Execution_Plans 中找到。

【讨论】:

quote “让查询优化器决定(原文如此)” .. 这(基本上)是如何决定的?通过统计? 不同的连接类型针对不同的查询语义进行了优化,是的,这些大多基于统计/基数,还有其他因素,例如连接的一侧是否比另一侧大得多,是否对连接每一侧的输入进行排序等。我和其他人一样......如果关于这个的博客文章让你大吃一惊,你最好让优化器决定,直到你掌握了两者之间的差异连接的类型感觉你比优化器更聪明。 @pure.Krone 。你是对的 。尽管我不知道确切的算法,但我知道它是带下划线的表和索引的统计功能,为带下划线的对象创建文件组的方式,服务器的核心数(MAXDOP)和许多其他因素。如果你想深入挖掘,我建议你阅读 Connor Cunningham 的博客,他是 MS SQL Core 的首席架构师。【参考方案2】:

您指的是join hint。与其他提示一样,连接提示只能作为最后的手段指定,因为大多数情况下 SQL 服务器会选择正确的算法。一篇很好的文章来解释其中一些是this。

【讨论】:

以上是关于什么时候应该使用 INNER -LOOP- JOIN 而不是 INNER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

koa中使用joi进行参数校验

[JOI 2014 Final]IOI 馒头

关于SQL数据库中cross join 和inner join用法上的区别?

如何在不增加行的情况下取消列出 R 和 inner_join 中的对象?

Joi 嵌套模式

对于 SQL,啥时候开始需要始终使用“Inner Join”而不是隐式连接?