Skip to content

Long running transactions in postgresql database

We get long running transactions in gitlab.com from 5/23. gitlab-com/gl-infra/production#854 (closed)

The transaction may be executed for over 30mins. It contains many queries where each query are relative fast. Below is a snapshot of such transaction and the query

attr value
txn_age 00:05:38.057067
pid 28168
query UPDATE "project_statistics" SET build_artifacts_size = COALESCE(build_artifacts_size, 0) + (-91450), storage_size = COALESCE(storage_size, 0) + (-91450) WHERE "project_statistics"."project_id" = 10339957
client_addr 127.0.0.1
application_name sidekiq 5.2.7 queues: post_rec...ndary_scheduler [5 of 27 busy]

we noticed this update query are executed multiple times in the transaction with different incremental values.

  1. is it necessary to combine all the queries in to a giant transaction instead of multiple small transactions?
  2. can we just update project_statistics once at the end of the transaction instead of multiple incremental updates? it has also produced large number of dead tuples which caused auto-vacuum to be executed extensively.