最快访问PLSQL中的集合以更新与记录关联的值

时间:2017-04-20 23:33:04

标签: oracle performance memory plsql

我试图将数据缓存到内存中,以便在PLSQL中的3个不同密钥上快速访问。任何有指针的语言都不存在这个问题,但是我很难与PLSQL斗争,因为我没有意识到这一点。我需要这样做是因为我有一个非常大的循环函数,它以非常精细的方式更新数据,否则将持续很长时间。

基本思想是我在内存中按key_1排序。我想要更改第一条记录的值,这些值会影响记录本身的key_1值以及集合中具有相同key_2并且具有任何key_3值作为记录I的记录的其他几个特定值改性。在修改之后,我只是将修改后的第一行冒泡到它的位置,而不是使用耗时的查询。

所以基本上记录如下:

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 个答案:

答案 0 :(得分:0)

首先,我可以推荐您的设计,并希望看到您按照设计的方式使用RDBMS(即索引访问)。

话虽如此,每个Oracle表都有一个rownum伪列,它是一个指向行的指针(即索引如何在内部引用表中的特定行)。如果您有记录,则可以将rownum保存在数据结构中以快速恢复(不要长期保持rownum,因为oracle可以在重新组织表/行时更改rownum)。