在执行期间,SQL引擎执行在由行源发生器产生的树的每一行的源。此步骤是DML处理中的唯一必需步骤。
图3-3是执行树,也称为解析树,它显示了示例3-1中计划中从一个步骤到另一个步骤的行源的流程。通常,执行步骤的顺序与计划中的顺序相反,因此您要从下至上阅读计划。
执行计划中的每个步骤都有一个ID号。图3-3中的数字对应Id于示例3-1中所示计划中的列。Operation计划列中的初始空格表示层次关系。例如,如果一个操作的名称以两个空格开头,则此操作是一个以一个空格开头的操作的子级。以空格开头的运算符是SELECT语句本身的子级。
图3-3行源树
在图3-3中,树的每个节点都充当行源,这意味着示例3-1中的执行计划的每个步骤要么从数据库中检索行,要么接受来自一个或多个行源的行作为输入。SQL引擎执行每个行源,如下所示:
- 黑框指示的步骤实际上是从数据库中的对象检索数据。这些步骤是访问路径,或用于从数据库检索数据的技术。
- 第6步使用全表扫描从
departments表中检索所有行。 - 步骤5使用全表扫描从
jobs表中检索所有行。 - 步骤4
emp_name_ix按顺序扫描索引,查找以字母开头的每个键A并检索相应的rowid。例如,与对应的rowidAtkinson为AAAPzRAAFAAAABSAAe。 - 第3步从
employees表中检索第4步返回了rowidAAAPzRAAFAAAABSAAe的行Atkinson。例如,数据库使用rowid 检索的行。
- 第6步使用全表扫描从
- 清除框指示的步骤对行源起作用。
- 第2步执行哈希联接,接受第3步和第5步的行源,在第3步中将第5步行源中的每一行连接到其对应的行,然后将结果行返回到第1步。
例如,employee的行
Atkinson与工作名称关联Stock Clerk。 - 步骤1执行另一个哈希联接,接受来自步骤2和6的行源,将来自步骤6的源的每一行连接到步骤2中的相应行,并将结果返回给客户端。
例如,employee的行
Atkinson与名为的部门相关联Shipping。
- 第2步执行哈希联接,接受第3步和第5步的行源,在第3步中将第5步行源中的每一行连接到其对应的行,然后将结果行返回到第1步。
在某些执行计划中,这些步骤是迭代的,而在其他计划中则是顺序的。例3-1中所示的哈希联接是顺序的。数据库根据连接顺序完整地完成步骤。数据库以的索引范围扫描开始emp_name_ix。数据库使用从索引中检索的行标识读取employees表中匹配的行,然后扫描jobs表。从jobs表中检索行后,数据库将执行哈希联接。
在执行期间,如果数据不在内存中,则数据库会将数据从磁盘读取到内存中。该数据库还将取出确保数据完整性所需的所有锁和闩锁,并记录在SQL执行期间所做的任何更改。处理SQL语句的最后阶段是关闭游标。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




