Postgresql 数据上传到Postgres时性能不佳
我正在从一个暂存表2向postgres表1提交300万条记录,我的更新和插入查询如下Postgresql 数据上传到Postgres时性能不佳,postgresql,query-performance,Postgresql,Query Performance,我正在从一个暂存表2向postgres表1提交300万条记录,我的更新和插入查询如下 UPDATE table1 t set col1 = stage.col1, col2 = stage.col2 , col3 = stage.stage.col3 from table2 stage
UPDATE table1 t set
col1 = stage.col1,
col2 = stage.col2 ,
col3 = stage.stage.col3
from table2 stage
where t.id::uuid = stage.id::uuid
and coalesce(t.name,'name') = coalesce(stage.name,'name')
and coalesce(t.level,'level') = coalesce(stage.level,'level');
INSERT INTO table1
(col1,
col2,
col3,
col4,
id,
name,
level)
select
stage.col1,
stage.col2,
stage.col3,
stage.col4,
stage.id,
stage.name,
stage.level
from table2 stage
where NOT EXISTS (select
from table1 t where
t.id::uuid = stage.id::uuid
and coalesce(t.name,'name') = coalesce(stage.name,'name')
and coalesce(t.level,'level') = coalesce(stage.level,'level'));
即使使用表中定义的完全相同的索引键(btree),我也面临性能问题(需要1.5个小时),为了测试原因,我创建了一个没有索引的表1副本,并且我能够在大约15~17分钟内提交整个数据。,因此,我倾向于认为索引正在破坏表上的性能,因为索引太多了(一些未使用的索引由于权限问题而无法删除)。我正在寻找改进/优化查询的建议,或者可能使用其他策略来升级数据以减少数据加载时间。感谢您的建议。对查询运行解释分析帮助我认识到,查询从未使用目标表上定义的索引,而是对大量行进行顺序扫描,原因是更新/插入中使用的一个键在定义的索引中没有合并,虽然这意味着在输入代码之前必须很好地处理null,但它显著提高了性能。我对进一步的改进持开放态度。哪个部分需要这么长时间?更新还是插入?您是否尝试过插入。。。关于冲突取而代之的是?@a_horse_和_no_name,我观察到插入和更新都需要很长时间(即使我要更新的数据比insert少),我过去也尝试过在冲突上插入,但看不到很多性能提升,我观察到的一个限制是,它只允许在定义的主键索引上插入,我使用的键集不同于您可以对任何唯一约束或索引使用的
on conflict()
,而不仅仅是主键orry@a\u horse\u和\u no\u name,我得到错误“error:没有唯一或排除约束匹配on conflict规范”当我尝试对非唯一索引的索引执行冲突查询时,我不是postgres专家,对此有何建议?如果要防止重复,应将这些索引定义为唯一索引