图 4 执行结果统计
1. 执行计划的表示
Id:执行计划的行表示,每行代表一个执行过程,但不是 SQL 的执行顺序,从 0 开始;
Operation:执行的操作描述,该描述是按前导空格进行分层的二叉树,“由根及叶”表示,
前导空格最长的那行层级最低,本例中 ID=8,但实际的执行顺序是“由叶到根”,自上而
下,第一个叶子节点最先被执行,即 ID=4,然后向下,第二个叶子,ID=6,继续,下一个
叶子,ID=8,到底,逐层递退,最后输出总结果,即 ID=0;
Oper Id:该 Id 是笔者为表述二叉树的构成加上去的,从 1 开始,以红圈标示;
Cost(%CPU):表示 IO+CPU 成本的总和,即,Cost = I/O cost + CPU cost,Oracle 会按某
个算法将 CPU cost 转换成 IO cost; %CPU 表示 CPU 成本占总 COST 的百分比,即四舍五入
后的 CPU/(CPU+IO) X100% 值,如 ID=3 的 hash join,CPU 占总 cost 的 10%,而总 cost 为
10,据此可知,该操作的 CPU cost = 10 X 10% = 1,而 IO cost = 10 – 10X10% =9。
2. 执行计划的遍历
SQL 语句二叉树的执行采用后序遍历,其规则为:先左后右、先子后父、左支发起、逐
层递退。即:对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点,
而针对于任一结点,都必须按前述规则一直向下搜索,直到发现它是“盲端”,即叶子结点
时为止。
故上述操作实际的执行次序,按红圈数字表示为:①②③④⑤⑥⑦⑧⑨⑩-11,结束;
按 ID 则为:4-6-8-7-5-3-9-2-10-1-0;
本例的具体步骤表述如下:
1) 先“全表扫描”(TABLE ACCESSS FULL)第一个数据表 department1,别名为 d;
2) 再全表扫描数据表 locations1,别名为 l
3) 再全扫第二个 employees1 表,别名为 e;
4) 对 3)执行缓冲区排序;
5) 对 4)、2)两表执行“笛卡尔积”;
评论