Postgresql Closing语句需要很长时间

时间:2018-04-12 13:32:19

标签: postgresql go gorp

为了向Postgres数据库添加数百万条记录并且内存消耗不断增加,我使用的是一个包含多个worker和gorp.Transaction的线程池。

每百万条记录,以下代码从不同的线程调用大约一百次,每次处理一批10000条记录左右:

func batchCopy(p importParams) error {
  copy := pq.CopyIn("entity", "startdate", "value", "expirydate", "accountid")
  stmt, err := p.txn.Prepare(copy)
  if err != nil {
    return err
  }

  for _, r := range p.records {
    _, err := stmt.Exec(
        r.startDate,
        r.value,
        r.expiryDate,
        p.accountId)

    if err != nil {
      return err
    }
  }

  if err := stmt.Close(); err != nil {
    return err
  }
  return nil
}

出于某种原因,我注意到PrepareClose来电时间很长,这个过程会非常缓慢。

然后我尝试对batchCopy的所有调用重用相同的语句,并在完成所有调用后关闭它。在这种情况下,batchCopy完成得非常快,但是当我拨打stmt.Close()时,它会花费很长时间。

问题:

  • 什么是正确的陈述方式?我应该每批创建一个还是重用它们?
  • stmt.Close()发生了什么,为什么在多次致电stmt.Exec后需要这么长时间?

0 个答案:

没有答案