pg_stat_statements:上位クエリ
pg_stat_statementsを有効にし、合計実行時間で負荷の高いクエリを見つけて、最適化の対象にします。
「pg_stat_statements:上位クエリ」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
pg_stat_statementsで分かること
すべてのクエリを形状ごとに正規化して蓄積する記録です。PostgreSQLで最も役立つDBAツールと言っても過言ではありません。
有効化する
これはcontrib拡張です。shared_preload_librariesに追加して再起動します:
-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
-- After restart:
CREATE EXTENSION pg_stat_statements;合計時間で上位のクエリ
「CPUはどこで消費されているのか」を調べるクエリです:
SELECT calls,
total_exec_time,
mean_exec_time,
rows,
query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;1回あたりの実行が遅いクエリ
毎回の実行に時間がかかるクエリです:
SELECT mean_exec_time, calls, query
FROM pg_stat_statements
WHERE mean_exec_time > 100
ORDER BY mean_exec_time DESC
LIMIT 20;頻繁に実行される軽量なクエリ
1ミリ秒のクエリでも、100万回実行されれば問題になります:
SELECT calls, mean_exec_time, total_exec_time, query
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 20;正規化
pg_stat_statementsは、クエリを正規化された形状ごとにグループ化します。リテラルは$Nに置き換えられます。そのため、「SELECT * FROM users WHERE id = 1」と「= 2」は同じ行になります。
統計情報をリセットする
デプロイ後に新しい挙動を測定するため、統計情報をリセットして最初から計測します:
SELECT pg_stat_statements_reset();I/O時間とCPU時間
新しいPGのバージョンでは、実行時間が分けて表示されます。shared_blks_hit / shared_blks_readから、キャッシュとディスクのどちらが使われているかを推測できます:
SELECT query, shared_blks_hit, shared_blks_read,
shared_blks_read::FLOAT / NULLIF(shared_blks_hit + shared_blks_read, 0) AS read_ratio
FROM pg_stat_statements
ORDER BY shared_blks_read DESC LIMIT 20;JITとプランニング時間
PG 13以降ではtotal_plan_timeが公開されています。実行するよりもプランニングに時間がかかるクエリがあります。通常は、prepared statementを使用すべき兆候です。
データベース単位/ユーザー単位の統計
pg_stat_statementsはクラスタ全体を対象とします。データベース単位またはユーザー単位のビューを作成するには、dbid列とuserid列で絞り込んでください。
EXPLAIN ANALYZEとの組み合わせ
pg_stat_statementsは、どのクエリが遅いかを教えてくれます。EXPLAIN ANALYZEは、なぜ遅いかを教えてくれます。
注意点
- データベース単位やユーザー単位での蓄積では問題が隠れることがあります。全体を確認してください
- 行ごとの時間ではなく、1回の呼び出し全体の時間だけを追跡します
- 再起動またはリセット呼び出しによってリセットされます
まとめ
pg_stat_statementsは本番環境で必須です。
- 合計時間で上位 → 最大の改善効果
- 平均時間で上位 → 一貫した遅さ
- 呼び出し回数で上位 → 頻度の問題
- 修正にはEXPLAINを組み合わせる
確認問題
pg_stat_statementsを有効にしました。改善効果が最も大きい調査対象のクエリを見つけるには、どのクエリを使えばよいでしょうか。
よくある質問
「pg_stat_statements:上位クエリ」レッスンは無料ですか?
はい。「pg_stat_statements:上位クエリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「pg_stat_statements:上位クエリ」で何を学びますか?
pg_stat_statementsを有効にし、合計実行時間で負荷の高いクエリを見つけて、最適化の対象にします。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「pg_stat_statements:上位クエリ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- pg_stat_statements:上位クエリ
- ログ分析のためのpgBadger
- コネクションプーリング:PgBouncer
- キャパシティプランニングと肥大化監査