用于比较表示的准确 PG 数据库大小

bel*_*daz 2 postgresql performance jdbc performance-tuning

我有一个 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
}
Run Code Online (Sandbox Code Playgroud)

显然这种方法有局限性,但我的期望是对于大文件(~100MB),报告的存储成本应该是合理的近似值。请注意,我使用pg_tablespace_size是为了包含主架构之外的数据的贡献,例如大对象(inpg_catalog.pg_largeobjectpg_catalog.pg_largeobject_metadata)。

我想知道这是否是一种正确的方法,以及是否有更好的方法。我不确定是否VACUUM ANALYZE正确更新了 使用的统计信息pg_tablespace_size,即使它是在同一会话中调用的。如果我可以避免调用VACUUM ANALYZE,也会更好,因为这需要以超级用户身份连接才能运行pg_catalog关系。

有什么想法吗?

Dan*_*ité 6

只需调用pg_database_size(dbname)即可知道数据库的大小。

VACUUM(没有FULL子句)不释放任何空间,它只是将其标记为可重用,因此不会更改数据库的大小(除非在罕见的边界情况下,请参阅Routine Vacuuming)。

ANALYZE 进行统计抽样,如果您需要行数,这将很有用,但对于全局数据库大小,这不是必需的。