簡単な序文として、私はpostgresqlの初心者です。さらに、アドバイスが必要なpostgresqlのバージョンは8.1です。その理由は、postgresql 8.1 が、ParAccel によるこの言語の最後の実装およびサポート バージョンであるためです。
Postgresql カーソルは、少なくとも 8.1 では、UPDATE や INSERT などの DML 操作で非常に遅くなります (DELETE はテストしていませんが、同じであると想定しています)。これはデモンストレーションのための単なる例です:
create table tab_cur_DML_test (col_key int,col_dml varchar(50));
いくつかのテーブルからいくつかのレコードを入力します。
insert into tab_cur_DML_test (col_key, col_dml)
select card_id, card_no
from card_dim;
tab_cur_DML_test には、2 つのフィールドのみを持つ数千のレコードが含まれるようになりました
create or replace function fn_cursor_DML_test() returns void as
$body$
declare
v_col_key card_dim.card_id%type;
v_col_dml card_dim.card_no%type;
cur refcursor;
v_count_proccessed_recs bigint := 0 ;
begin
open cur for select card_id, card_no from card_dim;
loop
fetch cur into v_col_key, v_col_dml;
if not found then exit; end if;
update tab_cur_DML_test
set col_dml = v_col_dml
where col_key = v_col_key;
v_count_proccessed_recs := v_count_proccessed_recs + 1;
if v_count_proccessed_recs%10 = 0 then
raise info '%', v_count_proccessed_recs;
end if;
end loop;
end;
$body$
language plpgsql volatile;
実行後:
select * from fn_cursor_DML_test();
速度は、30 秒あたり約 1,000 レコードであることがわかります。
繰り返しますが、これはセットベースの操作として実行できる単純な更新です。ここでは、カーソルを使用して行ごとの処理をシミュレートするためだけに使用しました。行ごとの処理が必要な同様の実際のタスクの状況では、単純な sql を使用してもうまくいかないか、そうでなければかさばりすぎたり複雑すぎたりする状況では、そのような低い処理速度でカーソルを使用するのは簡単です。実行可能なオプションではなくなります。
これは、データベース エンジンのコンテキスト スイッチが原因で発生したと思われます。私の質問は、ParAccel (v. 4.0) で、postgresql 8.1 カーソル内の行ごとのロジックを大幅に改善するための回避策 (または特定の方法) はありますか?
ありがとうございました!
スタニスラフ