繁体   English   中英

运行此sql命令时sql server上发生了什么

[英]What is happening on sql server when you run this sql command

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

在此输入图像描述

我有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连接。

如果没有查询计划,我只能猜测引擎如何潜在地执行您的查询,我希望它有所帮助:

第一步 - FROM:

如果在where列(user_id,user_id)上有索引,则可以在friends表上执行索引查找,其中where条件用于限制需要在执行计划中稍后评估的结果。 如果您没有索引,则可以执行表扫描。

您的查询将从friend表中选择user_id或friend_id等于72的所有行。

OR在这里意味着只有一个条件需要为行添加到朋友的行的数据流。

第二步 - 加入:

在找到应用where谓词的朋友行之后,将开始实际的连接处理。 根据表统计信息和查询成本,引擎可以执行嵌套循环连接,其中每个行都是针对用户的朋友进行评估的。 它还可以为一个表构建一个哈希表,并使用哈希键函数从另一个表中探测每一行。 这样可以在两个表(朋友和用户)之间匹配ID

ON定义了需要比较的列。

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

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

第3步 - 选择:

表连接后,引擎具有最终执行SELECT语句所需的所有数据,返回您要求的列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM