我有幾個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%以上。
我們建立的索引在查詢的時候效能會提高,但是在插入或者修改刪除資料的時候效能會降低。也就是索引多了不一定效能就能提升。所謂過猶不及。所以我們在建立索引的時候要根據具體的需要和具體的情況酌情在相應的欄位或欄位組合上建立索引,以保證最高的效能回報。