2017-04-20 15 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 In-Memory Database](http://www.oracle.com/technetwork/database/database-technologies/timesten/overview/index.html)をチェックしてください。 –

答えて

0

最初に、私はあなたのデザインに対してお勧めできますし、あなたがRDBMSを設計された方法(すなわち、インデックスに登録されたアクセス)で使用するのを見るでしょう。

このように、すべてのOracle表には行に対するポインタであるrownum擬似列があります(つまり、索引が表内の特定の行を内部的に参照する方法です)。レコードがあれば、データ構造にrownumを保存してすぐに元の状態に戻すことができます(テーブルや行が再構成されたときにoracleがlongを変更することはありません)。

+0

「テーブルや行が再編成されたときにオラクルがrownumを変更できるように長期的には長期間を持続しない」は少し弱く、FOR UPDATEを使用するとROWIDを使用して作業するときにその行がロックされます。 –

+0

ここのアイデアは確かですが、間違った擬似列です。各行に関連付けられたROWIDです。 Rownumは、処理のために選択された行に割り当てられます。同じクエリの異なる実行がまったく同じデータを返すことは可能ですが、各ローは異なるローを持ちます。 – Belayer

+0

あなたの考え/訂正のために@WernfriedDomscheitに感謝します。 –

関連する問題