我发现了这种情况;在Oracle中,我有此表:
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的性能?
答案 0 :(得分:0)
提供以上所有注释均正确,并且应使用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。
答案 1 :(得分:0)
我将检查每个服务器使用的磁盘类型-如果在AWS上,EBS的速度将比EFS快,在服务器中,本地SSD的速度比旋转磁盘或NFS快,等等。