插入性能 - 甲骨文与邮政



我发现了这种情况;在预言机中,我有这个表:

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 快,等等。

最新更新