当我运行左连接时,内部发生了什么?

时间:2009-11-04 17:08:52

标签: sql left-join

我对SQL上的左连接有疑问:我想知道SQL服务器如何执行左连接?

假设我有两张桌子。

个人

  • ID
  • 名称

PHONE

  • ID
  • 为person_id
  • 电话

执行时:

   select name, phone 
     from people 
left join phone on people.id = phone.person_id

...我想知道SQL服务器如何处理查询字符串。

我的猜测是:

  1. 选择所有人行
  2. 开始将电话行与on条件匹配。在这种情况下,people.id = phone_person_id。
  3. 如果找不到,则将'phone'值显示为null,因为它是左连接。
  4. 我说错了吗?

    此外,我应该阅读哪些书籍来获取此类信息?

3 个答案:

答案 0 :(得分:2)

发生了什么(至少在postgresql中,但可能是其他类似的)是查询规划器将采取您的查询并生成多个执行策略,然后它将根据它对表的知识对这些策略进行排名(通过统计数据),然后选择最佳执行策略并执行它。

在这里查看几个非常常见的策略:http://en.wikipedia.org/wiki/Join_%28SQL%29

基本上:

  • 嵌套循环:对于每个人,在手机中进行独立查找(就像很多小的内部SELECT)
  • 合并加入:如果它们具有允许
  • 的索引,则在//中扫描这两个表
  • 哈希加入:首先获取整个手机表内容并将其加载到哈希表中,然后让每个人检查该表并从该临时哈希表中获取相应的手机。

答案 1 :(得分:2)

对于所有联接,首先查询处理器查看正在连接的两个集,并根据这些表中的数据(由缓存的数据库统计信息表示),它组合两个表中的行,使用其中一个可用的合并技巧(Merge JoinHash Joinnested Loops)。完成后,组合集在其中有一行,用于从一侧开始的行与从另一侧开始的行的每个组合,这满足连接条件。

然后,如果它是外连接,则连接的“内部”侧的所有行都不满足连接条件(“外部”侧没有匹配的记录)被添加回组合集,所有列的空值都来自外侧..

答案 2 :(得分:1)

在SQL Server Management Studio中执行查询,在“查询”菜单下,选择获取“实际执行计划”的选项。

执行查询后,执行计划将作为单独选项卡上的图表返回。它从左到右读取。该计划将向您展示幕后发生的事情。

在这里阅读更多内容

http://msdn.microsoft.com/en-us/library/aa178423%28SQL.80%29.aspx

http://www.simple-talk.com/sql/performance/execution-plan-basics/