PostgreSQL - 空表

dan*_*eln 8 postgresql

我的PostgreSQL数据库架构上有一个名为EVENTS的表.
它是空的,即我执行时

SELECT * FROM EVENTS
Run Code Online (Sandbox Code Playgroud)

我得到一个空的结果集.

尽管如此,该表占用了5MB的磁盘空间.
我正在执行

SELECT round(pg_total_relation_size('events') / 1024.0 / 1024.0, 2)
Run Code Online (Sandbox Code Playgroud)

我得到了5.13MB.

我试图明确地运行VACUUM,但它没有改变任何东西.

有任何想法吗?

kli*_*lin 15

截断表格:

truncate events;
Run Code Online (Sandbox Code Playgroud)

文档:

TRUNCATE快速删除一组表中的所有行.它与每个表上的非限定DELETE具有相同的效果,但由于它实际上不扫描表,因此速度更快.此外,它立即回收磁盘空间,而不是需要后续的VACUUM操作.这对大型表最有用.

如果要立即回收磁盘空间以保留非空表的现有行,可以使用vacuum:

vacuum full events;
Run Code Online (Sandbox Code Playgroud)

这将专门锁定表并重写它(实际上,创建一个新副本并删除旧副本).这是一项昂贵的操作,通常不建议在较大的桌子上使用.

在RDBMS中,磁盘空间的一些冗余使用是正常状态.如果您具有正确配置的autovacuum守护程序,则在插入新行时将使用未使用的空间.

  • `vacuum full table`专门锁定表并重写它(实际上,创建一个新副本并删除旧副本).这是昂贵的操作,通常不推荐.在RDBMS中,磁盘空间的一些冗余使用是正常状态.插入新行时将使用未使用的空间. (2认同)