一連の動的クエリを実行してループする関数を作成すると、処理時間が指数関数的に大きくなるようです。例として、次のコードを使用します。コードでexecuteステートメントを使用する必要があることに注意してください。
FOR i IN 0..10 LOOP
EXECUTE 'SELECT AVG(val) FROM some_table where x < '||i INTO count_var;
IF count_var < 1 THEN
INSERT INTO some_other_table (vals) VALUES (count_var);
END IF;
END LOOP;
for ステートメントが 10 回ループすると、完了するまでに 125 ミリ秒かかります。私の for ステートメントが 100 回ループすると、完了するまでに 4,250 ミリ秒かかります。
100x のループが 1,250ms で終了するように使用できる設定はありますか?
編集:詳細
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
各実行クエリは、インデックスのみのスキャンを実行しています。これが計画です。
Aggregate (cost=85843.94..85843.94 rows=1 width=8) (actual time=1241.941..1241.944 rows=1 loops=1)
-> Index Only Scan using some_table_index on some_table (cost=0.00..85393.77 rows=300114 width=8) (actual time=0.046..1081.718 rows=31293 loops=1)
Index Cond: ((x > 1) AND (y < 1))
Heap Fetches: 0
Total runtime: 1242.012 ms
EDIT2:
plperl で関数を書き直しました。100x 実行クエリで「spi_exec_query()」を使用すると、4,250ms で実行されました。100x 実行クエリで「spi_query()」を使用すると、1,250 ミリ秒で実行され、指数関数的な増加がなくなりました。