当查询大的分区表数据的时候,并且还掺有 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,生成语句,查询结果。