
分享知识 收获快乐 http://www.acoug.org
http://www.acoug.org 实力成就稳健 技术创造价值
1. Oracle 的排序
本节主要介绍 Oracle 的排序算法与跟踪。
1.1 排序(sort)算法
在 Oracle 的排序过程中,首先将获取到的数据放入一块私有内存区(Sort Area)中进行排序。如果需要排
序的数据太大,无法一次在 Sort Area 中完成全部数据的排序,就会将 Sort Area 中排好序的数据直接写入(Direct
Write,数据不被 cache)临时空间作为一个数据集存在。当所有数据都在内存中排过序并写入了磁盘后,就会
将磁盘上的数据集进行合并排序 (Merge Sort)。合并排序是一个递归过程,直到所有数据集都被合入一个数
据集,排序才算完成。
1.2 初始化运行(Initial Runs)
数据最初在 Sort Area 中排序的过程被称为初始化运行。Sort Area 的 80~90%的空间需要被用于读缓冲,其
他空间则被用于写缓冲。如果我们知道有多少数据(可以通过需要排序的记录数、记录平均长度已经数据块大
小估算出来)需要进行排序,那么就可以用下面的公式来估算初始化运行的次数(也就是会产生多少个初始数
据集):
Initial Runs = CEIL(SORT_DATA_BLOKCS /
ROUND(0.8*SORT_AREA_SIZE/BLOCK_SIZE))
1.3 合并(Merges)
在进行合并时,可以同时合并 2 个或 2 个以上的数据集。一次合并多少个数据集就称为合并宽度(Merge
Width)。合并也是在 Sort Area 中完成的,进行合并之前,需要将数据从磁盘直接读入(Direct Read)内存中。
和全表扫描的多数据块读(MBRC)类似,对排序数据块的读取也可以是多个的,由 sort_multiblock_read_count
(SMRC,这个参数在 9i 后是隐含参数)控制一次读取的数据块数。不过,请注意,这个参数控制的 是一次
能读取的最大数据块数,而实际上一次能读取的数据块数是由 sort_area_size、数据块大小等数据计算得来的。
要进行合并操作,最少需要夺 取 2 个数据集;如果使用了异步 IO(disk_asynch_io=TRUE),需要有 2 块读缓
冲。因此实际的 SMRC 可以按照以下公式计算:
文档被以下合辑收录
评论