我发现了这种情况;在预言机中,我有这个表:
CREATE TABLE "MYSCHEMA"."MYTABLE"
(
"COL1" NUMBER,
"COL2" DATE,
"COL3" VARCHAR2(20 BYTE),
"COL4" NUMBER,
....
"COL34" VARCHAR2(2 BYTE)
);
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX3" ON "MYSCHEMA"."MYTABLE" ("COL4")
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX4" ON "MYSCHEMA"."MYTABLE" ("COL10")
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX5" ON "MYSCHEMA"."MYTABLE" ("COL1")
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX6" ON "MYSCHEMA"."MYTABLE" ("COL20")
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX1" ON "MYSCHEMA"."MYTABLE" ("COL3")
CREATE INDEX "MYSCHEMA"."MYTABLE_INDEX2" ON "MYSCHEMA"."MYTABLE" ("COL5")
CREATE TABLE MYSCHEMA.MYTABLE_AUX AS (SELECT * FROM MYSCHEMA.MYTABLE);
我为 postgres 复制了同一个表;如您所见,mytable_aux没有索引。
在 oracle 中,此查询需要 157 秒:
--table mytable count=0 rows
--table mytable_aux=8.289.678 rows
insert into MYSCHEMA.MYTABLE(select * from MYSCHEMA.MYTABLE_AUX); --175 seg
在 postgres 中,记录更少,需要超过 10 分钟
--table mytable count=0 rows
--table mytable_aux=3.557.365 rows
insert into myschema.mytable (select * from myschema.mytable_aux ); --10 minutes
请放心,来自两个数据库引擎的表是等效的,并且它们管理相同的记录。我错过了什么吗?如何提高 Postgres 性能?
如果上面的所有注释都是正确的,并且您应该使用 postgresql dba 分析问题,您可以尝试在会话级别调整 work_mem 参数:
SET work_mem to '1MB';
INSERT INTO myschema.mytable SELECT * FROM myschema.mytable_aux;
SET work_mem to '10MB';
INSERT INTO myschema.mytable SELECT * FROM myschema.mytable_aux;
您也可以尝试禁用/启用表日志记录,如果它有效! 您也可以尝试使用附加提示插入行,如果它有效! 目前尚不清楚您使用的是哪个 postgresql。
我会检查每台服务器使用的磁盘类型——如果您在 AWS 上,EBS 会比 EFS 快,在服务器中,本地 SSD 比旋转磁盘或 NFS 快,等等。