PostgreSQL9.4にて。
特定のテーブルに対するクエリが返ってこない。countすら返ってこない。
pgAdminでテーブルを参照しようとすると、テーブル名をクリックした時点で固まるという始末。
今回のケースではテーブルロックが関与していた。
1. テーブルのロック状況を調べる
select * from pg_stat_activity;
上記のSQLで、実行中のクエリ状況がわかる。右端のquery列でどんなクエリか判別できる。
「waiting」列が「t」になっているものは、待たされているクエリ。まずそれが存在していないかチェック。
加えて、その応答しないテーブルにアクセスしているクエリがないかチェック。query_startに開始時間も書いてあるので照らし合わせながら、長時間残っているような怪しいクエリを探す。見つけたらpidを控え、次のSQLでロック解除する。
2. ロック解除(クエリをキャンセル)する
select pg_cancel_backend(pid);
以上で、応答しなかったテーブルに無事アクセスできるようになった。