PostgreSQL将大数据从一个表复制到另一个表

PostgreSQL将大数据从一个表复制到另一个表,sql,postgresql,Sql,Postgresql,我有一个体系结构,当一些数据有时被复制到临时表中,然后在命令下,必须将这些有条件的数据复制到另一个表中,在此运行之前,根据所有表中相同的对象id进行计数、删除和更新。 最长的操作是复制-需要10分钟!在30万行。 插入t1(t1_f1,t1_f2,名称,值)在(对象id)t1_f1,t1_f2,名称,值上选择DISTINCT,其中加载过程id=695-例如 我可以加快这个过程吗?或者这是糟糕的架构,我必须改变它 一些更多的堆表可能包含很多数据,要复制的数据可能有数百万行。在堆和其他表中索引的某些

我有一个体系结构,当一些数据有时被复制到临时表中,然后在命令下,必须将这些有条件的数据复制到另一个表中,在此运行之前,根据所有表中相同的对象id进行计数、删除和更新。 最长的操作是复制-需要10分钟!在30万行。
插入t1(t1_f1,t1_f2,名称,值)在(对象id)t1_f1,t1_f2,名称,值上选择DISTINCT,其中加载过程id=695
-例如

我可以加快这个过程吗?或者这是糟糕的架构,我必须改变它

一些更多的堆表可能包含很多数据,要复制的数据可能有数百万行。在堆和其他表中索引的某些字段(用于计数或筛选)

这是一个针对不太大数据的计划

    Insert on main_like  (cost=2993.63..3115.51 rows=6094 width=797) (actual time=6143.194..6143.194 rows=0 loops=1) 
  ->  Subquery Scan on "*SELECT*"  (cost=2993.63..3115.51 rows=6094 width=797) (actual time=55.995..125.081 rows=6094 loops=1)
        ->  Unique  (cost=2993.63..3024.10 rows=6094 width=796) (actual time=55.909..79.237 rows=6094 loops=1)
              ->  Sort  (cost=2993.63..3008.86 rows=6094 width=796) (actual time=55.904..69.195 rows=6094 loops=1)
                    Sort Key: main_loadingprocessobjects.object_id
                    Sort Method: quicksort  Memory: 3321kB
                    ->  Seq Scan on main_loadingprocessobjects  (cost=0.00..465.02 rows=6094 width=796) (actual time=0.578..8.285 rows=6094 loops=1)
                          Filter: (loading_process_id = 695)
                          Rows Removed by Filter: 1428
Planning time: 0.394 ms
Execution time: 6143.631 ms
解释但不插入-

Unique  (cost=2993.63..3024.10 rows=6094 width=796) (actual time=48.915..52.902 rows=6094 loops=1)
  ->  Sort  (cost=2993.63..3008.86 rows=6094 width=796) (actual time=48.911..49.959 rows=6094 loops=1)
        Sort Key: object_id
        Sort Method: quicksort  Memory: 3321kB
        ->  Seq Scan on main_loadingprocessobjects  (cost=0.00..465.02 rows=6094 width=796) (actual time=0.401..5.516 rows=6094 loops=1)
              Filter: (loading_process_id = 695)
              Rows Removed by Filter: 1428
Planning time: 0.214 ms
Execution time: 53.694 ms
main_loadingprocessobjects-是堆
main_like-is t1

您可能会关注以下几点:

  • PostgreSQL中的COPY语句比insert into select语句快
  • 在此查询上创建复合索引,例如:(类型,类别) 在(对象id)t1\U f1、t1\U f2、名称和值上选择DISTINCT,其中 type='ti'和category='added'

  • GROUP BY语句比DISTINCT语句快 <> LI>如果PTESTRQL.CONF在TEMP表上使用很高,则增加<强> TimePuffux/Suff>。
  • 尝试使用CTE(公共表表达式)代替临时表
    希望我的这一点能对你未来的发展有所帮助。

    请分享
    SELECT DISTINCT ON(object_id)t1_f1,t1_f2,name,value where type='ti'和category='added'
    @VaoTsun的执行计划。如果你想从pgAdmin解释,我已经添加了它。对不起,不-我的意思是
    explain analysis SELECT DISTINCT ON(object_id)t1_f1,t1_f2,name,value,其中type='ti'和category='added'
    done,我使示例查询更真实=)您能解释并分析这个查询吗?在加载进程id=695的位置,在(对象id)t1 f1、t1 f2、名称、值上选择DISTINCT。没有插入声明?谢谢。hmmm关于复制-我是否必须首先将数据从select复制到文件,然后再从文件复制到目标表?是的,您可以这样做。或者您可以将其与文件结合使用,使您的文件成为外部表。您可以创建过程来执行该过程。