mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
This feature was using a process local map to track the first few blocks in the relation. The map was reset each time we get the block with enough freespace. It was discussed that it would be better to track this map on a per-relation basis in relcache and then invalidate the same whenever vacuum frees up some space in the page or when FSM is created. The new design would be better both in terms of API design and performance. List of commits reverted, in reverse chronological order:06c8a5090e
Improve code comments inb0eaa4c51b
.13e8643bfc
During pg_upgrade, conditionally skip transfer of FSMs.6f918159a9
Add more tests for FSM.9c32e4c350
Clear the local map when not used.29d108cdec
Update the documentation for FSM behavior..08ecdfe7e5
Make FSM test portable.b0eaa4c51b
Avoid creation of the free space map for small heap relations. Discussion: https://postgr.es/m/20190416180452.3pm6uegx54iitbt5@alap3.anarazel.de
128 lines
3.1 KiB
Plaintext
128 lines
3.1 KiB
Plaintext
<!-- doc/src/sgml/pgfreespacemap.sgml -->
|
|
|
|
<sect1 id="pgfreespacemap" xreflabel="pg_freespacemap">
|
|
<title>pg_freespacemap</title>
|
|
|
|
<indexterm zone="pgfreespacemap">
|
|
<primary>pg_freespacemap</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
The <filename>pg_freespacemap</filename> module provides a means for examining the
|
|
free space map (FSM). It provides a function called
|
|
<function>pg_freespace</function>, or two overloaded functions, to be
|
|
precise. The functions show the value recorded in the free space map for
|
|
a given page, or for all pages in the relation.
|
|
</para>
|
|
|
|
<para>
|
|
By default use is restricted to superusers and members of the
|
|
<literal>pg_stat_scan_tables</literal> role. Access may be granted to others
|
|
using <command>GRANT</command>.
|
|
</para>
|
|
|
|
<sect2>
|
|
<title>Functions</title>
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>
|
|
<function>pg_freespace(rel regclass IN, blkno bigint IN) returns int2</function>
|
|
<indexterm>
|
|
<primary>pg_freespace</primary>
|
|
</indexterm>
|
|
</term>
|
|
|
|
<listitem>
|
|
<para>
|
|
Returns the amount of free space on the page of the relation, specified
|
|
by <literal>blkno</literal>, according to the FSM.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
|
|
<varlistentry>
|
|
<term>
|
|
<function>pg_freespace(rel regclass IN, blkno OUT bigint, avail OUT int2)</function>
|
|
</term>
|
|
|
|
<listitem>
|
|
<para>
|
|
Displays the amount of free space on each page of the relation,
|
|
according to the FSM. A set of <literal>(blkno bigint, avail int2)</literal>
|
|
tuples is returned, one tuple for each page in the relation.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<para>
|
|
The values stored in the free space map are not exact. They're rounded
|
|
to precision of 1/256th of <symbol>BLCKSZ</symbol> (32 bytes with default <symbol>BLCKSZ</symbol>), and
|
|
they're not kept fully up-to-date as tuples are inserted and updated.
|
|
</para>
|
|
|
|
<para>
|
|
For indexes, what is tracked is entirely-unused pages, rather than free
|
|
space within pages. Therefore, the values are not meaningful, just
|
|
whether a page is full or empty.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
The interface was changed in version 8.4, to reflect the new FSM
|
|
implementation introduced in the same version.
|
|
</para>
|
|
</note>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Sample Output</title>
|
|
|
|
<screen>
|
|
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)
|
|
</screen>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Author</title>
|
|
|
|
<para>
|
|
Original version by Mark Kirkwood <email>markir@paradise.net.nz</email>.
|
|
Rewritten in version 8.4 to suit new FSM implementation by Heikki
|
|
Linnakangas <email>heikki@enterprisedb.com</email>
|
|
</para>
|
|
</sect2>
|
|
|
|
</sect1>
|