1

我有一个关于 SQL 左连接的问题:我想知道 SQL 服务器如何执行左连接?

假设我有两张桌子。

人们

  • ID
  • 姓名

电话

  • ID
  • person_id
  • 电话

当我执行时:

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

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

我的猜测是:

  1. 选择所有行的人
  2. 开始匹配电话行与条件。在这种情况下,people.id = phone_person_id。
  3. 如果未找到,则将“电话”值显示为空,因为它是左连接。

我对么??

此外,我应该阅读哪些书籍才能获得此类信息?

4

3 回答 3

2

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

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

基本上:

  • 嵌套循环:对于每个人,在电话中进行独立查找(如许多小的内部 SELECT)
  • 合并连接:扫描两个表 // 如果它们有索引允许
  • 哈希联接:首先获取整个电话表内容并将其加载到哈希表中,然后为每个人检查该表并从该临时哈希表中获取相应的电话。
于 2009-11-04T17:15:28.960 回答
2

对于所有连接,首先查询处理器查看正在连接的两个集合,并根据这些表中的数据(由缓存的数据库静态数据表示),使用一种可用的合并技术组合两个表中的行(合并连接哈希连接嵌套循环)。完成后,对于从一侧的行与从另一侧的行的每个组合,组合集中都有一行,这满足连接条件。

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

于 2009-11-04T17:22:03.217 回答
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/

于 2009-11-04T17:13:20.050 回答