Postgresql 数据上传到Postgres时性能不佳

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

我正在从一个暂存表2向postgres表1提交300万条记录,我的更新和插入查询如下

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专家,对此有何建议?如果要防止重复,应将这些索引定义为唯一索引