【发布时间】:2018-08-21 11:05:06
【问题描述】:
# table tbl_a
ID
Name
> tbl_a: 10000 record
CREATE INDEX ID on tbl_a USING btree (ID COLLATE pg_catalog."default")
# table tbl_b
Branch
ID
name
> tbl_b: 1000 record
CREATE INDEX ID on tbl_b USING btree (ID COLLATE pg_catalog."default")
我的功能
CREATE OR REPLACE FUNCTION name_func()
RETURNS SETOF AS
$BODY$DECLARE
_r record;
BEGIN
CREATE TEMP TABLE tmp_table AS
SELECT branch, ID, Name from tbl_b where 1 = 0;
FOR _r IN SELECT branch, ID, Name from tbl_b order by name
LOOP
INSERT INTO tmp_table
SELECT _r.branch, ID, Name FROM tbl_a where ID = _r.ID and Name = _r.Name;
END LOOP;
//do something with tmp_table
END
函数性能变慢
For ...循环
您对性能改进有什么建议吗? 请帮帮我!
【问题讨论】:
-
如果你关心性能,千万不要在 plpgsql 中使用 for 循环
-
你确定这个 FOR LOOP 有问题吗?我在 tbl_a 中创建了 25000 条记录,在 tbl_b 中创建了 1000 条记录的表并使用了这些函数。它平均在 33 毫秒内完成。第二件事 tbl_a 和 tbl_b 之间的关系是什么? 1:1、1:N、N:1。为什么它们中的任何一个都没有唯一 ID?
标签: sql postgresql performance