Postgres-在现有数据上运行触发器的性能问题

时间:2018-09-07 22:00:26

标签: postgresql database-trigger database-partitioning

我有一个正常工作的程序,如下所示:

  1. Powershell进程将记录插入到TABLE_A
  2. 定义为“在每行TABLE_A上插入数据后,...”的触发器读取每一行,对其进行解析,然后将已解析的数据加载到TABLE_B中。

这已经工作了好几个月,每天大约插入一千万个新行。由于表很大,因此已经按天对表进行了分区并进行了适当命名。 TABLE_A_20180807TABLE_B_20180807等...

由于疏忽,我设法创建了一个为期数周的TABLE_A分区,而没有适当的触发器,因此TABLE_B中没有相应的记录。

要重新处理现有数据,我采用了以下方法:

  1. 分离每个TABLE_A分区。
  2. 重命名每个分离的TABLE_A分区。
  3. 使用触发条件重新创建正确 TABLE_A分区
  4. 使用以下查询,使用触发器将原始数据从TABLE_A的分离版本中复制到正确的版本中。...

    INSERT INTO TABLE_A (field1, field2) 
    SELECT field1, field2 FROM TABLE_A_20180807_BCK;
    

这应该可以,但是到目前为止(12小时)它没有返回任何结果。

我有两个问题:

  1. 这是对现有数据运行触发器的最佳方法吗?
  2. 有什么办法可以监视该过程并检查它是否确实有效?

我正在Windows上使用Postgres 10。所有其他会话均事先断开连接,我已经运行了一些随机查询,声称可以确定锁定问题,但是它们似乎表明没有死锁,请单击here进行查询。我已经检查了TABLE_B,并且没有迹象表明它会变大,但是我认为在整个交易完成之前,任何新行都将不可见?


根据评论进行更新: 我很确定触发器的速度不是问题,在正常情况下,记录的加载速度为每毫秒1条记录或每秒1000条记录。那应该等于每15分钟100万条记录,因此我的1000万行表应该在大约3个小时内重新加载。

好吧-这个过程终于完成了,所以我想它毕竟没有挂起。传输以大约每秒100条记录或每条记录10ms的速度进行。我想现在的问题是,为什么每个记录从另一张表转移所需的时间比从外部源加载所需的时间长10倍?

0 个答案:

没有答案