2016-11-30 67 views
3

我有这个sql查询。我现在什么是返回,但无法理解服务器如何一步一步地解析和执行它。 我想深入了解工作原理,运行sql命令时服务器上发生了什么,返回结果之前如何在每一行中进行迭代。当你运行这个sql命令时,sql server上发生了什么

enter image description here

我有usersfriends表中,最后一个有friend_iduser_id组合,他们两人都是用户的ID。

select u.id,f.user_id, f.friend_id from friends f 
    INNER JOIN users u on (u.id = f.friend_id or u.id = f.user_id) 
    where f.user_id = 72 or f.friend_id = 72 
  • 如何解释我是什么在此查询的每一步怎么回事?
  • 它在每一步中的表现如何?
  • OR如何在这里的每一步操作符?
  • 它是否检查每个步骤中OR运算符的两个语句或 查询,或者例如在第一次迭代中加入friend_id,然后与 user_id加入。
+1

这将是值得删除不正确的标签。这是MySQL还是SQL Server? –

+0

MySQL是否有类似于SQL Server的执行计划? –

+0

我已经使用了EXPLAIN命令,但它不是我正在寻找的,我需要了解工作选择查询的原理。它是如何工作的,或者是编译的。 –

回答

2

没有查询计划,我只能猜测引擎如何可能执行查询,我希望它能帮助:

第一步 - FROM:

如果你有一个指数在where列(user_id,user_id)上,可以在您的朋友表上执行索引搜索,并使用Where条件来限制稍后在执行计划中需要评估的结果。如果您没有索引,则可以执行表扫描。

您的查询将选择从朋友表中的所有行,其中USER_ID或friend_id等于72

OR此意味着只有一个条件需要为真该行被添加到行的数据流来自朋友。

第2步 - JOIN:

行找到了朋友后应用,其中谓语,实际的连接处理将开始。 根据表统计信息和查询成本,引擎可以执行嵌套循环连接,其中每行都是从朋友对用户进行评估。它也可以为一个表建立一个散列表,并使用散列键功能探测另一个表中的每一行。这样,您的两个表(朋友和用户)之间的id可以匹配。

ON定义了需要比较哪些列。

让我们考虑一个更容易理解的嵌套循环连接的情况。 此连接类型循环遍历按行方式连接在一起的两个数据流(朋友和用户),并评估每行。

在您的查询中,它将比较u.id和friend_id。如果此条件返回true,则加入将被履行,并且引擎将组合来自表格朋友和用户的匹配行以进行进一步处理。如果ON的第一个条件为false或未知,则引擎将评估第二个条件user_id。 True满足连接,false或unknown意味着行不匹配,所以它不会被返回,因为在这种情况下,两种情况都会失败。

第3步 - 选择:

后的表都加入了对发动机有它需要的所有最终执行SELECT语句,返回你问它的列中的数据。