7. 排序相关操作
该类操作和SQL语句执行计划中的排序操作相关。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。
1)BUFFER SORT
在会话服务进程内存中对某个行源数据进行排序或其他相关操作,该操作最早出现于Oracle 9.0.1版本。该操作具体如图7-1中节点3所示。
图7-1 排序相关操作BUFFER SORT示例
2)SORT AGGREGATE
通过sum,count,max,min等函数获取数据的汇聚结果,期间,需要对相关行源数据进行排序实现。该操作具体如图7-2中节点1所示。
图7-2 排序相关操作SORT AGGREGATE示例
3)SORT CREATE INDEX
在索引创建期间进行的排序操作。该操作具体如图7-3中节点2所示。
图7-3 排序相关操作SORT CREATE INDEX示例
4)SORT GROUP BY
基于列值对数据行进行排序分组操作。该操作具体如图7-4中节点1所示。
图7-4 排序相关操作SORT GROUP BY示例
5)SORT GROUP BY ROLLUP
基于列值对数据行进行排序分组并进行合计操作。该操作具体如图7-5中节点1所示。
图7-5 排序相关操作SORT GROUP BY ROLLUP示例
6)SORT GROUP BY STOPKEY
基于列值对数据行进行排序分组操作,并通过rownum伪列对返回的数据行数进行限定,rownum相关条件不再满足时,即终止相关操作并输出结果。
--注:
1)rownum: 一个伪列,其数据并非真实存在的数据,而是获取其他字段数据时,输出结果集中每行数据的序号。通常可用于限定SQL语句返回结果的行数,从而对相关SQL语句进行性能优化。
该操作具体如图7-6中节点3所示。
图7-6 排序相关操作SORT GROUP BY STOPKEY示例
7)SORT GROUP BY NOSORT
基于列值对数据行进行分组操作,因数据行输入顺序与需求顺序一致,该操作无需排序就可直接对数据行进行分组。例如:通过索引范围或完全扫描输出的数据行无需排序就可直接进行分组。该操作具体如图7-7中节点1所示。
图7-7 排序相关操作SORT GROUP BY NOSORT示例
8)SORT GROUP BY NOSORT ROLLUP
基于列值对数据行进行分组和合计操作,因数据输入顺序与需求顺序一致,无需排序就可直接对数据行进行分组和合计。该操作具体如图7-8中节点1所示。
图7-8 排序相关操作SORT GROUP BY NOSORT ROLLUP示例
9)SORT ORDER BY
基于相关列值对数据行进行排序,以实现数据的按序输出。该操作具体如图7-9中节点1所示。
图7-9 排序相关操作SORT ORDER BY示例
10)SORT ORDER BY STOPKEY
基于相关列值对数据行进行排序,以实现数据的按序输出,且通过rownum伪列限定返回的数据行数。该操作具体如图7-10中节点3所示。
图7-10 排序相关操作SORT ORDER BY STOPKEY示例
11)SORT UNIQUE
基于相关列值对数据行进行排序并去重,以输出无重复数据的结果集。该操作具体如图7-11中节点1所示。
图7-11 排序相关操作SORT UNIQUE示例
12)SORT UNIQUE NOSORT
基于相关列值对已有序数据行进行去重,以输出无重复数据的结果集。该操作具体如图7-12中节点1所示。
图7-12 排序相关操作SORT UNIQUE NOSORT示例
13)SORT UNIQUE STOPKEY
基于相关列值对数据行进行排序并去重,以输出无重复数据的结果集,且通过rownum伪列限定返回的数据行数。该操作具体如图7-13中节点3所示。
图7-13 排序相关操作SORT UNIQUE STOPKEY示例
14)SORT PARTITION JOIN
基于连接列值对数据行进行排序和分组(分区),以完成后续的连接操作,该操作出现于分组(分区)外连接中。
--注:
1)这里的“分区”不是指表的分区,而是指执行计划中一种特定的操作。
该操作具体如图7-14中节点6所示。
图7-14 排序相关操作SORT PARTITION JOIN示例