PostgreSQLスキルアップノート(自己啓発のための個人サイト)

pg_buffercacheモジュール(共有バッファキャッシュ内の確認)


【一覧に戻る】
自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ pg_buffercacheモジュール(共有バッファキャッシュ内の確認)
■■■■
■■■■
■■■■ 2013/02/18
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
                                                                   (C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

pg_buffercacheは共有バッファキャッシュ内の状況を把握するためのモジュール。
別にインストール(CREATE EXTENSION)が必要。
性能トラブル解析やSQLの性能測定の際に使う。


【マニュアル】

追加で提供されるモジュール・pg_buffercache→●[マニュアル]



■1■ インストール
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

インストールはCREATE EXTENSIONするだけでよい。(CREATE EXTENSIONは9.1以降)
測定対象のデータベースへ接続してCREATE EXTENSIONをする。


【□】 CREATE EXTENSION pg_buffercache;





■2■  pg_buffercacheの定義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


postgres=# \d pg_buffercache

   ビュー "public.pg_buffercache"
     カラム     |    型    | 修飾語
----------------+----------+--------
 bufferid       | integer  |
 relfilenode    | oid      |
 reltablespace  | oid      |
 reldatabase    | oid      |
 relforknumber  | smallint |
 relblocknumber | bigint   |
 isdirty        | boolean  |
 usagecount     | smallint |



※ bufferid          個々のバッファの番号
   isdirty boolean   ダーティページかどうか 




■3■  pg_buffercacheの参照
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【注意】

・pg_classに対して結合して使う場合、現在のデータベースのOIDまたは0と等しいreldatabase
を持つ行に限定して結合するようにする。 

・参照すると内部でメモリのロックがかかるためむやみの実行は控える。



1.relnameごとのバッファ数
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

接続したデータベースに関するもの(上位10個)を表示


【□】 psql psotgres postgres

【□】 

SELECT c.relname, count(*) AS buffers
    FROM pg_buffercache b INNER JOIN pg_class c
    ON b.relfilenode = pg_relation_filenode(c.oid) AND
          b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database()))
             GROUP BY c.relname
             ORDER BY 2 DESC
             LIMIT 10;


            relname             | buffers
--------------------------------+---------
 t1                             |    3241
 pg_proc                        |      61
 pg_proc_proname_args_nsp_index |      23
 pg_attribute                   |      23
 pg_statistic                   |      17
 pg_operator                    |      13
 pg_depend_reference_index      |      12
 pg_class                       |      11
 pg_proc_oid_index              |       9
 pg_depend                      |       8
(10 行)
(10 行)






2.ダーティページの情報のみを表示する
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ダーティページとは共有バッファ上で更新され、まだディスクに書き出されていないページのこと。


【□】 

SELECT c.relname, count(*) AS buffers
    FROM pg_buffercache b INNER JOIN pg_class c
    ON b.relfilenode = pg_relation_filenode(c.oid) AND
          b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database()))
          AND
          b.isdirty = true
             GROUP BY c.relname
             ORDER BY 2 DESC
             LIMIT 100;




■4■  実施例・チェックポイントによってダーティページがすべて書き出される確認
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

チェックポイント実施前

【□】  b.isdirty = trueのものだけを抽出

SELECT c.relname, count(*) AS buffers
    FROM pg_buffercache b INNER JOIN pg_class c
    ON b.relfilenode = pg_relation_filenode(c.oid) AND
          b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database()))
          AND
          b.isdirty = true
             GROUP BY c.relname
             ORDER BY 2 DESC
             LIMIT 100;


             relname              | buffers
----------------------------------+---------
 t1                               |    2070
 pg_statistic                     |       4
 pg_class                         |       3
 pg_statistic_relid_att_inh_index |       2
 pg_attribute                     |       1
 pg_index                         |       1
(6 行)



チェックポイントの実行

【□】  checkpoint;



チェックポイント実施前
【□】  b.isdirty = trueのものだけを抽出

SELECT c.relname, count(*) AS buffers
    FROM pg_buffercache b INNER JOIN pg_class c
    ON b.relfilenode = pg_relation_filenode(c.oid) AND
          b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database()))
          AND
          b.isdirty = true
             GROUP BY c.relname
             ORDER BY 2 DESC
             LIMIT 100;


 relname | buffers
---------+---------
(0 行)



チェックポイントにより共有バッファ上の未反映のダーティページはすべて書き出された。



以上 
inserted by FC2 system