Campaign Classic v7 - db モジュール pg_stat_statements の目的と使用方法

Adobe Campaign Classic v7 での db (データベース)モジュールの pg_stat_statements の目的と使用について説明します。

説明 description

環境

Adobe Campaign Classic v7 (ACC v7)

問題/症状

  1. db モジュール pg_stat_statements とは

  2. クライアントからイネーブルにするように要求される理由

  3. アクティブ化の仕組み

解決策 resolution

  1. pg_stat_statements モジュールは、サーバが実行するすべての SQL 文の実行統計を追跡する手段を提供します。

    モジュールは、追加の共有メモリが必要なため、postgresql.confshared_preload_librariespg_stat_statements を追加して読み込む必要があります。

    つまり、モジュールを追加または削除するには、サーバーを再起動する必要があります。

    リンク https://www.postgresql.org/docs/9.4/pgstatstatements.html

  2. このテーブルにビュータイプのスキーマを実装すると、時間がかかるクエリを監視できます。

    このようにして、クライアントはそれらを調整し、パフォーマンスを最適化することができます。

    この拡張機能では、クエリの実行に関する指標を提供します。最も頻繁に実行されるクエリはどれか、およびそれぞれのクエリの所要時間です。

  3. pg_stat_statements

    1. postgres バージョンの公式 PostgreSQL contrib パッケージがインストールされていることを確認します。

      code language-none
      $ dpkg -l | grep postgres
      postgresql-contrib-9.3
      

      インストールされていない場合は、インストールします。

      code language-none
      $ apt-get install postgresql-contrib-9.3
      
    2. 起動時にモジュールをプリロードするように postgresql.conf を変更します。

      デフォルト:shared_preload_libraries = ''

      新規:shared_preload_libraries = 'pg_stat_statements'

      pg_stat_statementsauto_explain の両方を使用する場合は、ONE レコードを使用し、コンマで区切ります。

      code language-none
      shared_preload_libraries = 'auto_explain,pg_stat_statements'
      
    3. 監視するデータベースで、次のクエリ CREATE 実行します。

      auto_explain の場合は、拡張機能の作成は必要ありません(pg_stat_statements の場合のみ)。

      code language-none
      psql
      postgres=# \c mydatabase
      mydatabase=# CREATE EXTENSION pg_stat_statements;
      
    4. postgresql.conf のカスタマイズされたOPTIONSセクションで、次の行を追加します。

      code language-none
      pg_stat_statements.max = 5000
      pg_stat_statements.track = all
      pg_stat_statements.save = on
      
    5. postgresql サービスを再起動します。

    例:データベース内で最もコストのかかる上位 5 件のクエリを取得します。

    code language-none
    SELECT query, calls, total_time, rows, 100.0*shared_blks_hit/nullif(shared_blks_hit+shared_blks_read,0) AS hit_percent
    from pg_stat_statements as s inner join pg_database as d on d.oid = s.dbid
    where d.datname = 'Database_Name'
    order by total_time desc limit 5;
    
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f