【问题标题】:Performance query PostgreSQL性能查询 PostgreSQL
【发布时间】: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


【解决方案1】:

只需在您的insert . . . select 中使用join

INSERT INTO tmp_table (id, name)
    SELECT a.ID, a.Name
    FROM tbl_a a JOIN
         tbl_b b
         ON a.id = b.id AND a.name b.Name;

或许:

INSERT INTO tmp_table (id, name)
    SELECT a.ID, a.Name
    FROM tbl_a a 
    INTERSECT
    SELECT b.ID, b.Name
    FROM tbl_b b;

请注意,这将返回重复项,但这可能是可取的。

【讨论】:

  • 第一个选项中的 WHERE 条件似乎有点奇怪。
  • @Koen。 . .谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-08-03
  • 2013-02-17
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多