<!--
$Header: /cvsroot/pgsql/doc/src/sgml/diskusage.sgml,v 1.5 2002/09/21 18:32:52 petere Exp $
-->

<chapter id="diskusage">
 <title>Monitoring Disk Usage</title>

 <sect1 id="disk-usage">
  <title>Monitoring Disk Usage</Title>

  <indexterm zone="disk-usage">
   <primary>disk usage</primary>
  </indexterm>

  <para>
   Each table has a primary heap disk file where most of the data is
   stored. To store long column values, there is also a
   <acronym>TOAST</> file associated with the table, named based on the
   table's OID (actually <literal>pg_class.relfilenode</>), and an index on the
   <acronym>TOAST</> table. There also may be indexes associated with
   the base table.
  </para>

  <para>
   You can monitor disk space from three places: from
   <application>psql</> using <command>VACUUM</> information, from
   <application>psql</> using <application>contrib/dbsize</>, and from
   the command line using <application>contrib/oid2name</>. Using
   <application>psql</> on a recently vacuumed (or analyzed) database,
   you can issue queries to see the disk usage of any table:
<programlisting>
play=# SELECT relfilenode, relpages
play-# FROM pg_class
play-# WHERE relname = 'customer';
 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 row)
</programlisting>
  </para>

  <para>   
   Each page is typically 8 kilobytes. (Remember, <literal>relpages</>
   is only updated by <command>VACUUM</> and <command>ANALYZE</>.) To
   show the space used by <acronym>TOAST</> tables, use a query based on
   the heap relfilenode shown above:
<programlisting>
play=# SELECT relname, relpages
play-# FROM pg_class
play-# WHERE relname = 'pg_toast_16806' OR
play-#       relname = 'pg_toast_16806_index'
play-# ORDER BY relname;
       relname        | relpages 
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1
</programlisting>
  </para>

  <para>
   You can easily display index usage too:
<programlisting>
play=# SELECT c2.relname, c2.relpages
play-# FROM pg_class c, pg_class c2, pg_index i
play-# WHERE c.relname = 'customer' AND
play-#       c.oid = i.indrelid AND
play-#       c2.oid = i.indexrelid
play-# ORDER BY c2.relname;
       relname        | relpages 
----------------------+----------
 customer_id_indexdex |       26
</programlisting>
  </para>

  <para>
   It is easy to find your largest files using <application>psql</>:
<programlisting>
play=# SELECT relname, relpages
play-# FROM pg_class
play-# ORDER BY relpages DESC;
       relname        | relpages 
----------------------+----------
 bigtable             |     3290
 customer             |     3144
</programlisting>
  </para>

  <para>
   <application>dbsize</> loads functions into your database that allow
   you to find the size of a table or database from inside
   <application>psql</> without the need for <command>VACUUM/ANALYZE.</>
  </para>
  <para>
   You can also use <application>oid2name</> to show disk usage. See
   <filename>README.oid2name</> for examples. It includes a script
   shows disk usage for each database.
  </para>
 </sect1>
</chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
