「今そこにある危機」を捉える
 “pg_stat_statements revisited”



        アップタイム・テクノロジーズ

                        永安 悟史



  Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   1
アジェンダ
• 「pg_stat_statements」とは

• 機能と仕様(8.4~9.2)

• Normalize(正規化)とは

• どのような時に使えるのか

• どのような時に「使えない」のか

• 「今そこにある危機」を捉える

             Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   2
「pg_stat_statements」とは
• PostgreSQL 8.4で導入されたビュー
  – より正確には、ビューを実現する拡張モジュール
  – インストール、設定が必要


• ユーザ、データベース、クエリの種類別に集計される
  –   何回実行されたか
  –   どれだけ時間がかかったか
  –   何レコード取り出したか
  –   何ブロック読んだか、書いたか
  –   等々・・・




                             http://www.postgresql.jp/document/9.2/html/pgstatstatements.html
            Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.           3
「pg_stat_statements」とは




 Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   4
機能と仕様
• PostgreSQL用の共有ライブラリとして提供
  – サーバ起動前にpostgresql.confで設定する必要がある
  – shared_preload_librariesパラメータ

• クエリ種別、実行回数、総実行時間等を収集
  – クエリの中の「値」が異なると、異なるクエリとして集計(9.1まで)
  – 9.2以降は、Normalize(正規化)により値の異なるクエリも集約

• 集計値を保持するpg_stat_statementsビューを提供
  – ビューを作成するSQL文を実行する必要がある(スーパーユーザ)
  – 9.1以降であれば CREATE EXTENSION … を実行


• 集計値のリセットは専用のSQL関数を使う
  – SELECT pg_stat_statements_reset()
                                http://www.postgresql.jp/document/9.2/html/pgstatstatements.html
               Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.           5
機能と仕様 cont’d


                                                                        8.4




                                                                          9.2

                                                                         9.0
                                                                          9.2




                                                                          9.2

                 http://www.postgresql.jp/document/9.2/html/pgstatstatements.html
Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.           6
Normalize(正規化)とは




                                                  Normalizeなし(9.1)




                                                  Normalizeあり(9.2)
Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.    7
どのような時に使えるのか
• どのクエリがたくさん実行されているのかを知りたい

• どのクエリの実行に時間がかかっているのかを知りたい

• どのクエリがリソースを食っているのかを知りたい

• サーバログにSQLを大量に出力されても困る




        Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   8
どのような時に「使えない」のか
• モジュールをロードしていない
 – shared_preload_librariesの設定をしていない


• バージョンが9.1までで、かつ、プリペアードクエリを使ってい
  ない
 – バインド変数を使っていると、同じクエリとして集計される




                 Normalizeなし(9.1)、プリペアードクエリ使用

            Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   9
「今そこにある危機」を捉える
• 今現在、目の前のPostgreSQLサーバの負荷が高い、重い。

• 何が問題なのかを知りたい。SQLに問題があるなら、その
  SQLを抽出したい。

• サーバに負荷を掛けたくない、設定をいじりたくない。

• 累積値ではなく、今の値が知りたい。統計情報は無闇にリ
  セットしたくない。

• 他にもやらなければならないことはたくさんある。手間をかけ
  たくない。

        Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   10
「今そこにある危機」を捉える cont’d
• 今から10秒間の間に実行されたSQL文を抽出する

• 抽出された各SQL文の実行回数と総実行時間を把握する
 – 総実行時間 = 平均実行時間 × 実行回数


• 各SQL文ごとのアクセス状況を把握する
 – block hit(バッファ読み込み)、block read(ブロック読み込み)等




• その後、ヘビーなSQL文をなんとかする
 – ブロックI/Oが多い? バッファヒットが多くてCPU使ってる?


           Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   11
デモ
• snap_rank_statement_by_totaltime.sql




              Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   12
snap_rank_statement_by_totaltime.sql
• やってくれること
 – 10秒間に実行されたSQL文を抽出
 – 総実行時間でランキングを作成、上位20件を表示


• 内部でやっていること
 –   pg_stat_statementsビューのスナップショットを作成
 –   10秒待つ
 –   再度、pg_stat_statementsビューのスナップショットを作成
 –   スナップショット間の差分を計算してランキング


• 入手先
 – http://www.uptime.jp/go/pgperf



               Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   13
Q&A



Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   14
【お問い合わせ先】
アップタイム・テクノロジーズ合同会社
担当:永安
E-mail: snaga@uptime.jp
Web: http://www.uptime.jp/

               Copyright (c) 2013 Uptime Technologies, LLC. All rights reserved.   15

「今そこにある危機」を捉える ~ pg_stat_statements revisited