pg_freespacemapモジュールは、空き領域マップ(FSM)を検査する手法を提供します。pg_freespaceと呼ばれる関数、正確に言うと、ふたつの多重定義された関数を提供します。それらの関数は、特定のページ、あるいはリレーションにおける全てのページに対する、空き領域マップに記録された値を示します。
デフォルトでは、潜在的なセキュリティ問題が存在するため、それら関数からのPUBLICアクセスは無効にされています。
pg_freespace(rel regclass IN, blkno bigint IN) returns int2FSMに応じて、blknoで指定されたリレーションのページ上の空き領域の量を返します。
pg_freespace(rel regclass IN, blkno OUT bigint, avail OUT int2)FSMに応じてリレーションの各ページの空き領域の量を表示します。リレーション内のそれぞれのページに対し1タプルとして、1組の(blkno bigint, avail int2)タプルが返されます。
空き領域マップに格納された値は、正確ではありません。 それらはBLCKSZ(デフォルトBLCKSZでは32バイト)の1/256の精度で丸められ、また、それらは挿入されて更新されているので、完全に最新に保たれるというわけではありません。
インデックスでは、ページ内の空き領域ではなく、完全に未使用のページが追跡されます。 したがって、値には意味がなく、単にページが一杯か空かを表します。
注意: 同バージョンで導入された新しいFSM実装を反映するためにバージョン8.4でインタフェースを変えました。
postgres=# SELECT * FROM pg_freespace('foo');
blkno | avail
-------+-------
0 | 0
1 | 0
2 | 0
3 | 32
4 | 704
5 | 704
6 | 704
7 | 1216
8 | 704
9 | 704
10 | 704
11 | 704
12 | 704
13 | 704
14 | 704
15 | 704
16 | 704
17 | 704
18 | 704
19 | 3648
(20 rows)
postgres=# SELECT * FROM pg_freespace('foo', 7);
pg_freespace
--------------
1216
(1 row)
オリジナルバージョンは Mark Kirkwood <markir@paradise.net.nz>によるものです。
バージョン8.4では、Heikki Linnakangas <heikki@enterprisedb.com>により、新しいFSM実装に合うよう書き直されました。