【问题标题】:How do I optimize this PostgreSQL query?如何优化这个 PostgreSQL 查询?
【发布时间】:2021-01-27 07:04:43
【问题描述】:

为了压力测试,我在 PostgreSQL 中执行以下表格:

CREATE TABLE tempxx (sid numeric(10,0));

CREATE TABLE temptab( 
r1 numeric(10,0),
r2 numeric(10,0),
r3 numeric(10,0),
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';

如何优化查询以缩短时间?我可以优化循环中的“更新”和“插入”命令吗?

【问题讨论】:

    标签: postgresql query-optimization stress-testing


    【解决方案1】:

    按预期影响顺序进行优化:

    • 你的压力测试主要是写,所以你应该为此优化: 增加max_wal_size相当多以减少检查点的数量(查看PostgreSQL日志文件以获得解释)

    • 如果可以,请使用序列代替tempxx

    • bigint 用于tempxx.sid

    • 使用更大的--wal-segsize 创建运行initdb 的数据库集群,以减少WAL 开关

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多