我需要逐行处理一个大表格,我使用了stored proc和一个循环:
FOR rec in
SELECT s.id_main AS id
FROM big_table b
LEFT JOIN small_table s ON s.id = b.word_id
ORDER BY b.id
LOOP
-- do something
END LOOP;
在第一次迭代之前,Postgres从temp_tablespaces中使用了大量的空间。如何避免在选择过程中大量使用temp_tablespaces?(我不在乎几GB的使用量)。
表格:
CREATE TABLE big_table (
id bigint NOT NULL,
word_id int NOT NULL,
CONSTRAINT big_table__pk PRIMARY KEY (id) USING INDEX TABLESPACE corpus
)
TABLESPACE corpus;
CREATE TABLE small_table (
id int NOT NULL,
id_main int NOT NULL,
CONSTRAINT small_table__pk PRIMARY KEY (id)
);
即使是一个简化的循环,在第一次迭代之前也会使用大量temp_tablespace:
FOR rec in
SELECT id
FROM big_table
ORDER BY id
LOOP
RAISE NOTICE 'id= %, %', rec.id, timeofday();
END LOOP;
为什么Postgres需要一些temp_tablespaces存储空间而不是直接使用PK?没有ORDER BY id
,就不会使用temp_tablespaces。
1条答案
按热度按时间p5fdfcr11#
通过将数据拆分为小块并按块进行馈送选择来解决。“小块”大小介于100000和10000000行之间时性能最佳(取决于服务器)。在这种情况下,无需更改循环中的处理逻辑。