我有一个 Java/JDBC 程序,它获取一个样本文件并将数据导入数据库,将其分解成多个关系。该程序针对几种不同的表示多次执行此操作,其中一种使用大对象。我可以分享这些表示的更多细节,但它们很长并且与这个问题无关,因为我正在寻找通用的东西。
我想通过在每次导入后检查数据库的大小来比较这些不同表示的大小。数据库位于 PostgreSQL 9.4 本地 Windows 服务器实例上,没有其他用户和默认配置。它的唯一目的是进行此测试。
我最初的计划如下:
for each representation {
call VACUUM ANALYZE
record old DB size with SELECT pg_tablespace_size('pg_default');
import data into database
call VACUUM ANALYZE
record new DB size with SELECT pg_tablespace_size('pg_default');
store storage cost as new DB size - old DB size
}
显然这种方法有局限性,但我的期望是对于大文件(~100MB),报告的存储成本应该是合理的近似值。请注意,我使用pg_tablespace_size
order 来包括主模式之外的数据贡献,例如大对象(inpg_catalog.pg_largeobject
和pg_catalog.pg_largeobject_metadata
)。
我想知道这是否是一种正确的方法,以及是否有更好的方法。我不确定是否VACUUM ANALYZE
正确更新了 所使用的统计信息pg_tablespace_size
,即使它是在同一会话中调用的。如果我能避免调用 也会更好VACUUM ANALYZE
,因为这需要以超级用户身份连接才能在pg_catalog
关系上运行。
有什么想法吗?
只需调用
pg_database_size(dbname)
即可知道数据库的大小。VACUUM
(没有FULL
子句)不会释放任何空间,它只会将其标记为可重用,因此不会更改数据库的大小(除了在罕见的边界情况下,请参阅Routine Vacuuming)。ANALYZE
进行统计抽样,如果您需要行数,这将很有用,但对于全局数据库大小,则没有必要。