性能:在从UNLOGGED转换为LOGGED之前或之后创建索引?

时间:2019-02-03 23:11:24

标签: database postgresql performance transaction-log

我正在开发一种软​​件,该软件最初会用大量数据填充表(批量模式),然后切换到“正常”操作模式。

为了快速进行批量模式,我从几乎没有索引的UNLOGGED表开始。

在加载所有初始数据后,我切换到普通模式:我正在创建索引并更改要再次记录的表。

我的问题是:性能明智-创建索引和更改为LOGGED表的顺序是否有所不同?从可靠性的角度来看,我切换到LOGGED的速度似乎越快(丢失我所有宝贵数据的机会越小)。但是我是否需要及时支付创建所有索引所需的时间?

在我的初始测试中,ALTER TABLE x SET LOGGED似乎花费了很多时间,我不明白,因为我认为它只会影响之后的操作,而其本身几乎是 不可以。

我的PG是:

  

x86_64-pc-linux-gnu上的PostgreSQL 9.6.11,由gcc(GCC)7.3.0编译,64位

尽管我问的更笼统。任何有助于我理解UNLOGGEDLOGGED(特别是与标记结合在一起)到底发生了什么的事物的链接也将不胜感激。

1 个答案:

答案 0 :(得分:1)

无论在什么时候创建索引,如果将数据加载到未记录的表然后将其更改为已记录的表,您将获得的收益不如您想象的那样。

未记录表的好处是不会写入WAL(事务日志)。但是,当您将未登录的表转换为已登录的表时,将写入完整表的WAL 及其索引。这是必要的,因为现在PostgreSQL必须能够在发生崩溃的情况下恢复该表。

您的收获是WAL将以块方式而不是逐行写入。

如果必须在加载表和将表转换为已记录表之间进行修改,则未记录表将成为一大优势。所有这些修改都不必进行WAL记录。