如果我创建一个循环执行一堆动态查询的函数,处理时间似乎会成倍增加。举个例子,我将使用以下代码。请记住,我必须在我的代码中使用执行语句。
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 毫秒才能完成。
有没有我可以使用的设置,以便在 1,250 毫秒内完成 100 次循环?
编辑:更多信息
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
编辑2:
我用plperl重写了这个函数。当我在 100x 执行查询上使用“spi_exec_query()”时,它运行了 4,250 毫秒。当我在 100 倍执行查询上使用“spi_query()”时,它在 1,250 毫秒内运行 - 消除了指数增长。