Tihiroのストレスフリーな生活

少しだけ頭使って後は根性

PostgreSQLでテーブル指定でロックを調べるSELECT文

概要

テーブルの定義を変更しようとしたら、誰かがSELECT文を投げていて待たされる。そんな経験、誰もがお持ちですよね? そこでどんな処理でロックがかかっているのかが分かればストレスも多少は軽減されます。

環境

PostgreSQL 10です。

調べる

SELECT
    loc.pid
  , cls.relname
  , loc.mode
FROM
  pg_locks loc
 INNER JOIN pg_class cls
       ON loc.relation = cls.oid
WHERE
  cls.relname = 'テーブル名'

もっと調べる

pg_stat_activityと組み合わせると、そのクエリがいつから実行されているのかもわかります(どのIPアドレスから実行されているかも!)。

SELECT
    loc.pid
  , act.datname
  , cls.relname
  , loc.mode
  , act.backend_start
  , act.xact_start
  , act.query_start
  , act.query
  , act.client_addr
  , act.state
FROM
  pg_locks loc
 INNER JOIN pg_class cls
       ON loc.relation = cls.oid
 INNER JOIN pg_stat_activity act
       ON loc.pid = act.pid
WHERE
  cls.relname = 'テーブル名'

まとめ

時間がないときに限って時間がかかる。