Postgresのロック+便利コマンド

Postgresの便利コマンド:ロック関連

【ロック確認】・・・①
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode FROM pg_locks l LEFT JOIN pg_class c ON l.relation=c.relfilenode LEFT JOIN pg_database db ON l.database = db.oid ORDER BY l.pid;

【ロック解除】
SELECT pg_cancel_backend(①で検索したpid);

【ロックレベル確認】
SHOW TRANSACTION ISOLATION LEVEL;

【ロックレベル設定】
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Postgresの便利コマンド:行ロック関連

【行ロック】・・・①
begin; --明示する必要があれば実行(a5m2などのautocommitがデフォルトでonになっている場合に必要になる)
select [カラム名] from [テーブル名] where [カラム名 = 1] for update nowait;

【行ロック解除】
rollback;  ①で行ロックした後、ロック解除する場合に実行する

Postgresの便利コマンド:その他

【現在の接続数】
SELECT * FROM pg_stat_activity;

【接続数の設定】
SHOW max_connections;

【現在実行されているSQL一覧】・・・①
select pid, query_start, now() - query_start as lap, state, query
from pg_stat_activity where state <> 'idle'
order by lap desc;
(現在実行中のクエリはpg_stat_activityテーブルが管理している)

pid: プロセスのID。SQLを停止する時に指定する。
query_start: SQLクエリを実行し始めた時間。
query: 実行しているSQLクエリ。長いことも多々あるので適当に最初の方だけ見ている。
state: 実行状態。activeでないものは何らかの理由で待っているだけなので、停止対象にならないはず。

【SQLを停止する】
SELECT pg_cancel_backend(pid);--①で検索したpid(プロセスID)を指定する

【実行時間が長いSQL】・・・遅いSQL(改善の対象を探すために実施する)
--pg_stat_statementsを検索
SELECT query, calls, total_time, rows FROM pg_stat_statements ORDER BY total_time DESC;