我有几个oracle存储过程,其中有两个涉及到递归运算,相对来说非常费时间的。这几个oracle程序我给他们编号为 p1,p2,p3,p4,p5  其中p2,p5有较复杂的递归运算,涉及到的表格主要有4个,分别为t1,t2,t3,t4。另外还有一些基础表。

数据首先在基础表中,t1,t2,t3,t4中没有数据。

t1,t2,t3,t4的数据结构基本一样,
p1是将基础库中的数据按不同的类别(六种类别)根据规则进行计算,将结果存到t1中。
p2是将t1中的数据按不同类别分别进行递归运算。将结果存储到t2中
p3是将t1中不同类别的唯一号相同(解释:每个类别的数据都有一个唯一号与其它的类别的相对应的,即类别1中有唯一号是10020的,那么类别2、类别3、类别4、类别5、类别6中也有相应的唯一号是10020的一条记录)数据进行汇总。结果存入t3中。t3中的数据就不会分类别了。因为是汇总了的。
p4将t2中的数据进行汇总,算法与p3相近,只不过p4汇总的是已经进行过递归运算的数据。最后结果存入t4,这个t4就是最终的结果。
p5将t3总的已经汇总了的数据进行递归运算。算法与p2相近。但是此时只进行一次递归。而p2是对各个类别分别进行递归。最后结果与p4运算的结果理论上是一样的。也就是从基础数据可以通过两个路径求出最终的结果(t4)。

首先我是在四个表中分别建了3-4个索引:在唯一号(id)和p_id上(解释:p_id 与唯一号(id)进行内部关联形成了比较复杂的树状结构)各建一个索引,另外有两个会用来作条件限定的字段上也分别建了索引。

此时对五种运算进行测试。结果:

程序执行时间表

 

 max(秒)

 min(秒)

 avg(秒)

 p1

 67

 19

 20

 p2

 101

 67

 70

 p3

 6

 2.5

 3

 p4

 6

 2.5

 3.5

 p5

 19

 8

 10

后来我将那两个用作条件限定的字段上面的索引删了,只留下id和p_id上面的索引。又进行了测试。结果:

程序执行时间表

 

 max(秒)

 min(秒)

 avg(秒)

 p1

16

 12

 14

 p2

66

54

58

 p3

1.6

 1.3

 1.4

 p4

1.5

1.3

1.4

 p5

10.8

8.6

9

可见除了p5性能提升只有10%外。其它的提升都达到了20%以上。

 我们建立的索引在查询的时候性能会提高,但是在插入或者修改删除数据的时候性能会降低。也就是索引多了不一定性能就能提升。所谓过犹不及。所以我们在建立索引的时候要根据具体的需要和具体的情况酌情在相应的字段或字段组合上建立索引,以保证最高的性能回报。