lock_timeout と statement_timeout の使い方

待ちすぎない・長すぎる SQL を止める

書き方

SET lock_timeout = '3s';
SET statement_timeout = '30s';
ALTER ROLE ロール SET statement_timeout = '5min';
ALTER SYSTEM SET lock_timeout = '10s';(全体。ふつうはしない)

lock_timeout は、ロックを取れずに待つ時間の上限です。超えると canceling statement due to lock timeout で、その文だけを取り消します。ALTER TABLE などの DDL は強いロック(AccessExclusiveLock)を待つ間、後から来た読み書きもすべて後ろに並ばせるので、lock_timeout を短く決めてから流し、あきらめたら時間をおいて流し直します。statement_timeout は、1 つの文の時間の上限です(canceling statement due to statement timeout。上限は文を始めたときの設定で決まり、いま動いている文には、あとから決めた値は効きません)。ALTER ROLE … SET で決めると、そのロールの次の接続から効きます。

例

SET lock_timeout = '2s';
ALTER TABLE orders ADD COLUMN memo text;
ALTER ROLE report SET statement_timeout = '10min';

実際に打って練習する

障害対応(PostgreSQL)コースの Lv12「行列を作る工事 ALTER TABLE の待ち」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。

すべてのレベルが、プラチナ以上のプランで遊べます。

PostgreSQL の障害対応で使う構文一覧へ戻る