集合中的每一个条目是%ROWTYPE或相似的记录变量。给定这样一个集合,数据可能表示成两种结构:
1、记录的数组(先创建一行,然后将其加入到列表中)
2、数组的记录(创建多个列表,然后把它们连成一个记录)
但应该使用哪种数据结构呢?回答此问题需要考虑两个方面:
1、填充结构时能有多高效?
2、从其中取出数据时效能有多高?
下面我们来做一个测试(OS:sun 5.10, Oracle: 10.2.0)。首先创建一个包pkg,它包含两个过程:rec_of_array_test和array_of_rec_test。它们两个的负载相同,但每个都以与各自同名的数据结构来执行。
在包中需要定义一些变量,以测试数据结构。srec_list是一个记录(srec)的数组,其中srec记录包含了3个标量变量,而array_rec是一条记录,其中每个字段都是一个数组(num_list)。
对每个数据结构,执行两次计时测试。做了2 000 000次赋值,即循环500 000次,每次将一个值赋给4个记录元素A、B、C和D。(行17——24)。
然后,为了测试获取数据的性能,将从结构中读取250 000个伪随机的条目。跟往常一样,dbms_utility.get_time来记录开始时间和结束时间(行25——34)。
然后对另一个数据结构进行相同的测试。测试结果如下:
所以,对于填充和取值,似乎都是使用记录的数组比使用数组的记录要更高效。不要问为什么,兴许Oracle开发团队的某个人能告诉你,但能否知道原因并不重要,重要的是我们设计了一个测试来证明这个结论。在10g 2.0版本中,两者之间的差异显而易见(测试结果得出),但不能保证Oracle在以后的版本不做出改变。