Postgresql - plpgsql - 动态查询拼接表(如分区表)

本文介绍了一种通过拆分大表来提高查询速度的方法,利用存储过程和循环语句生成查询语句,有效解决了大数据量下查询缓慢的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当查询大的分区表数据的时候,并且还掺有 join 的时候 ,简直不能再慢了。

有一个笨拙的方法可以解决这个问题,就是将表拆分开。

 

当表名结构是有规律的时候,可以用一个存储过程,简单的循环出来。

例:

mytest=# \d+ test_p
                                                        Table "public.test_p"
 Column |          Type          | Collation | Nullable |              Default               | Storage  | Stats target | Description
--------+------------------------+-----------+----------+------------------------------------+----------+--------------+-------------
 id     | integer                |           | not null | nextval('test_p_id_seq'::regclass) | plain    |              |
 col1   | character varying(100) |           |          |                                    | extended |              |
Child tables: test_1,
              test_2,
              test_3,
              test_4,
              test_5,
              test_6,
              test_7,
              test_8,
              test_9

mytest=# select id from test0627;
 id
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
(9 rows)

-- PLPGSQL
CREATE OR REPLACE FUNCTION f_test0701() 
RETURNS VOID AS $$
DECLARE
  rec RECORD;
  sql_1 text;
  sql_2 text;
  query text;
  x text;
BEGIN
  sql_1 = 'select id from test0627';
  sql_2 = 'select id, col1 from test_';
  FOR x in EXECUTE sql_1 
  LOOP
    query = sql_2 || x;
    FOR rec in EXECUTE query 
    LOOP
      RAISE NOTICE ' % ', rec.id;
    END LOOP;
  END LOOP;
END;
$$ language plpgsql;

-- 查询
mytest=# select f_test0701();
NOTICE:   101
NOTICE:   201
NOTICE:   301
NOTICE:   401
NOTICE:   501
NOTICE:   601
NOTICE:   701
NOTICE:   801
NOTICE:   901
-[ RECORD 1 ]
f_test0701 |

 

可以通过plpgsql,生成语句,查询结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值