0Pricing
SQL Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. pg_stat_statements:上位クエリ
  2. ログ分析のためのpgBadger
  3. コネクションプーリング:PgBouncer
  4. キャパシティプランニングと肥大化監査
← SQL Academyに戻る