Tihiroのストレスフリーな生活

少しだけ頭使って後は根性

PostgreSQLでレコードのブロック番号を調べる方法

やりたいこと

テーブル内に格納されているレコードのブロック番号を調べたいってときありますよね?

環境は

です。が、多分どのバージョンでも大丈夫です。

調べる

pg_visibilityという拡張モジュールを使うと確認することができます。

postgres=# CREATE EXTENSION pg_visibility;

で、モジュールを追加して

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
(0 行)

という感じで使います。

変化させてみる。

pg_visibilityの結果は0件でしたが、これはテーブルの中にレコードが入っていなかったためです。ので、レコードを追加してみましょう。

postgres=# insert into test values (1);
INSERT 0 1

追加したので、もう一度確認してみます。

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
     0 | f           | f          | f
(1 行)

増えてますね。

postgres=# VACUUM test;
VACUUM

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
     0 | t           | f          | t
(1 行)

VACUUMすると、全可視状態(all_visible = true)になりました。

全可視状態かどうかを調べる。

全可視状態かどうかはIndex Only Scanが使われる条件でもありますので重要です。そのテーブルが全可視状態かどうかを調べるには単純にWHERE句に追加するだけで確認することができます。

postgres=# SELECT * FROM pg_visibility('test') WHERE all_visible = false;

で、結果が0件であれば、そのテーブルは全可視状態となります。