2017-04-20 39 views
0

我試圖將數據緩存到內存以便在PLSQL中的3個不同鍵上快速訪問。這個問題在任何有指針的語言中都不存在,但是我正在爲PLSQL而苦苦掙扎,因爲我沒有意識到這一點。我需要這樣做,因爲我有一個非常大的循環函數,以非常細緻的方式更新數據,否則將持續相當長的時間。PLSQL中用於更新與記錄相關的值的最快訪問集合

基本的想法是,我有一個按key_1排序的內存集合。我想對第一條記錄的值進行更改,這會影響記錄本身的key_1值以及集合中具有相同key_2並具有與我修改的記錄相同的key_3值的其他記錄的其他特定值。修改後,我只是將修改的第一行冒泡排序,而不是使用耗時的查詢。

所以基本上一個記錄是這樣的:

create type t_num_tbl is table of number; 

create type rec_type as object 
(
key_1 number, 
key_2 varchar2(30), 
key_3 t_num_tbl  
); 

和收集是這樣的:

create type rec_typetbl is table of rec_type; 

v_rectbl rec_typetbl := rec_typetbl(); 

如果我修改記錄我不得不給出一個選擇/更新程序看起來像這樣能夠修改相關記錄:

SELECT * 
FROM table(v_rectbl)t 
WHERE t.key_2 = modifiedrec.key_2 
    AND 
    (SELECT count(*) 
    FROM table(t.key_3) 
    JOIN table(modifiedrec.key_3) USING (column_value)) > 1; 

這裏的主要問題是數據不在內存中編入索引,訪問速度不夠快,不適合我的目的。

在PLSQL中是否有任何解決方案可以與使用記錄中的指針數組的性能相比較來集合的關聯元素?由於key_2,key_3值不會更改,因此事先知道這些關聯。

+1

也許這對您的應用程序來說是一種矯枉過正,但請檢查Oracle [TimesTen內存數據庫](http://www.oracle.com/technetwork/database/database-technologies/timesten/overview/index.html) –

回答

0

首先,我可以推薦您的設計,並希望看到您按照設計的方式使用RDBMS(即索引訪問)。儘管如此,每個Oracle表都有一個rownum僞列,它是一個指向行的指針(即,索引如何在內部引用表中的特定行)。如果你有記錄,你可以將rownum保存在你的數據結構中以便快速返回(不要長期保留rownum,因爲當表/行重新組織時,oracle可以更改rownum)。

+0

使用「不要堅持rownum的長期,因爲oracle可以在表/行重新組織時更改rownum」有點弱,更好地使用FOR UPDATE,當你使用ROWID時,這些子句會被鎖定。 –

+0

這裏的想法是堅實的,但錯誤的僞列。它是與每行關聯的rowid。 Rownum被分配到該行,因爲它被選中進行處理。同一查詢的不同運行可能返回完全相同的數據,但每行都有不同的rownum。 – Belayer

+0

感謝@WernfriedDomscheit提供您的想法/更正。 –

相關問題