监控磁盘空间的使用
这段内容主要描述了数据库中表的存储方式以及如何监控磁盘空间使用情况。
监控磁盘的使用
表的存储方式:
- 每个表都有一个主堆磁盘文件,用于存储大部分数据。
- 如果表中有任何可能具有宽值的列(即数据长度可能超过标准页大小的列),则可能还会有一个与表相关联的TOAST文件。TOAST文件用于存储那些太宽而无法舒适地放入主表中的值。(更多关于TOAST的详细信息参见第73.2节)
- 如果存在TOAST文件,它将有一个有效的索引。
- 基础表也可能有与之关联的索引。
- 每个表和索引都存储在单独的磁盘文件中,如果文件超过1GB,则可能不止一个文件。这些文件的命名约定在第73.1节中有描述。
监控磁盘空间的方法:
- 可以使用三种方式监控磁盘空间:
- 使用表9.96中列出的SQL函数。
- 使用oid2name模块。
- 手动检查系统目录。
- SQL函数是最易于使用的方法,通常也是推荐的。
- 接下来的部分将展示如何通过检查系统目录来实现。
使用psql查询表的磁盘使用情况:
- 在最近进行过VACUUM或ANALYZE操作的数据库上使用psql,可以发出查询以查看任何表的磁盘使用情况。例如,使用以下查询查看名为’customer’的表的磁盘使用情况:
SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer';
查询结果会显示文件路径和占用的页数
。每页通常是8KB
。(注意:relpages字段只在VACUUM、ANALYZE和一些DDL命令如CREATE INDEX时更新)。- 如果需要直接检查表的磁盘文件,文件路径名是有用的。
通过这些信息,可以有效地管理和监控数据库表和索引的磁盘空间使用情况。
对于timescaledb的超表使用下面的sql查看磁盘使用情况
SELECT
c.relname AS table_name,
pg_relation_filepath(c.oid) AS filepath,
c.relpages AS pages
FROM
pg_class c
JOIN
pg_inherits i ON c.oid = i.inhrelid
JOIN
pg_class parent ON parent.oid = i.inhparent
WHERE
parent.relname = '你的超表';
VACUUM和ANALYZE命令
在 PostgreSQL 中,VACUUM
和 ANALYZE
是用于维护数据库的重要命令。以下是它们的用法及其功能:
VACUUM
VACUUM
命令用于清理数据库中的无效数据,释放空间,提高性能。
基本用法
VACUUM;
- 效果:对当前数据库执行清理,处理所有表。
对特定表执行
VACUUM my_table;
- 效果:仅清理指定的表。
完全清理
VACUUM FULL;
- 效果:完全清理数据库,压缩表并释放空闲空间。这会锁定表,因此会影响其他操作。
ANALYZE
ANALYZE
命令用于收集有关表和索引的统计信息,以帮助查询优化器生成更有效的查询计划。
基本用法
ANALYZE;
- 效果:对当前数据库中的所有表收集统计信息。
对特定表执行
ANALYZE my_table;
- 效果:仅对指定的表收集统计信息。
联合使用
您可以同时运行 VACUUM
和 ANALYZE
,以同时清理和优化数据库:
VACUUM ANALYZE;
- 效果:对所有表执行 VACUUM 和 ANALYZE 操作。
总结
- 使用
VACUUM
来清理表和释放空间。 - 使用
ANALYZE
来更新统计信息,优化查询性能。 - 为特定操作选择合适的命令和选项,以最大化数据库的性能和效率。
显示由TOAST(表所占用的空间)
要显示由TOAST(The Oversized-Attribute Storage Technique)表所占用的空间,可以使用如下所示的查询语句
SELECT relname, relpages
FROM pg_class,
(SELECT reltoastrelid
FROM pg_class
WHERE relname = 'customer') AS ss
WHERE oid = ss.reltoastrelid OR
oid = (SELECT indexrelid
FROM pg_index
WHERE indrelid = ss.reltoastrelid)
ORDER BY relname;
relname | relpages
----------------------+----------
pg_toast_16806 | 0
pg_toast_16806_index | 1
查看和展示索引所占用的空间大小
SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'customer' AND
c.oid = i.indrelid AND
c2.oid = i.indexrelid
ORDER BY c2.relname;
relname | relpages
-------------------+----------
customer_id_index | 26
找到你数据库中最大的表和索引
超表的话显示的是分表
SELECT relname, relpages
FROM pg_class
ORDER BY relpages DESC;
relname | relpages
----------------------+----------
bigtable | 3290
customer | 3144