如何解决如何优化该PostgreSQL查询?
对于压力测试,我在PostgreSQL中执行以下表:
CREATE TABLE tempxx (sid numeric(10,0));
CREATE TABLE temptab(
r1 numeric(10,0),r2 numeric(10,r3 numeric(10,v1 varchar(40),v2 varchar(40));
CREATE UNIQUE INDEX stemptab ON temptab (r1 ASC,r2 ASC);
INSERT INTO tempxx VALUES (1);
然后我使用此功能:
CREATE OR REPLACE FUNCTION stresstest1() RETURNS VOID
LANGUAGE plpgsql AS $$
DECLARE
S1 TIMESTAMP;
S2 TIMESTAMP;
S3 TIMESTAMP;
xm1 int;
BEGIN
UPDATE tempxx SET sid=sid+1;
S1:=CURRENT_TIMESTAMP;
FOR REC IN 1..100000 LOOP
UPDATE TEMPXX SET SID=SID+1 returning SID into xm1;
INSERT INTO TEMPTAB VALUES (xm1,REC,rec,'TEST '||REC,'TEST2 '||REC);
END LOOP;
S2:=CURRENT_TIMESTAMP;
S3:=CURRENT_TIMESTAMP;
RAISE NOTICE '%','STARTED AT '||S1||' TO '||S2||' TO '||S3||' '||(S2-S1)||' '||(S3-S1);
END
$$;
SELECT stresstest1();
大约需要14m。我想缩短这段时间。我做了这些调整,但结果没有改变。
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET work_mem = '5242kB';
ALTER SYSTEM SET random_page_cost = '4';
如何优化查询以缩短时间?我可以在循环中优化“更新”和“插入”命令吗?
解决方法
按预期影响顺序进行优化:
-
您的压力测试主要是编写的,因此您应该为此进行优化: 大量增加
max_wal_size
来减少检查点的数量(查看PostgreSQL日志文件以获得解释) -
如果可以,请为数字生成器使用序列,而不要使用
tempxx
-
将
bigint
用于tempxx.sid
-
使用更大的
initdb
创建运行--wal-segsize
的数据库集群,以减少WAL切换次数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。