【性能优化】5.8 [有序遍历] 索引排序

 

【性能优化】5.7 [有序遍历] 序号分组与可控分段

5.8 索引排序

我们知道索引的本质就是排序,如果我们想把数据表按被查找键排序,是不是可以利用已经建好的索引呢?

很遗憾,大部分情况没有效果。

如果原始数据表并没有按被查找键排序,即使已经建好索引,然后可以从索引中可以按次序地读出每一条记录的物理位置,不需要再做排序运算,也不会比直接做大排序有多少优势。这是因为,大排序算法虽然还要再做排序运算,但它对外存数据表的访问基本上是连续的,每次读写都是一大批;而使用索引按次序读取数据时,虽然不用执行排序动作,但数据在外存中的物理位置经常是不连续的,这可能导致被浪费的读取非常多,综合算下来,也就很可能比大排序算法的性能还要差。

其实索引对于大部分遍历式的运算都没什么效果,它主要针对返回结果集非常少的场合。

不过,虽然用现成的索引来排序,总体排序时间不见得比大排序算法更快,但它有一个有优势的地方,这种办法能够很快地就开始输出数据。而大排序算法需要先把所有数据遍历完,生成缓存文件之后才能开始输出数据,会有个较长时间的等待期。

快速开始输出数据有什么应用场景呢?

比如需要把大数据按次序传输出去,远程传输本身很慢,常常比大排序快不了多少。如果能早点开始传输,就能节约很多时间。这时候用索引排序就有优势,这种算法马上就可以开始返回数据进行传输,而不必等待。


A

1

=file("data.ctx").open()

2

=A1.index(file("data.idx");ID;…)

3

=A1.icursor@s(…;;file("data.idx"))

icursor@s 将保证返回按指定索引排序的数据(无选项时不保证次序,但一般是按物理位置为序,这样速度更快)。也将返回成游标,然后可以 fetch 出数据(去做传输)。

【性能优化】6.1 [外键关联] 外键地址化
【性能优化】 前言及目录