在加载数据之前或之后创建索引

jcz*_*lew 6 postgresql

我有一种情况需要在 Postgres 中创建一个表并添加大约 300 万行。目前,我正在加载所有数据向一个字段添加索引,但我想知道加载数据之前(在创建表时)添加索引是否更好、更糟或中性。

当索引应该添加到 Postgres 中的表时,什么被认为是最佳实践?Postgres 是否在事务期间暂停索引?

jja*_*nes 7

在填充表后添加索引会更快,甚至可能快得多。首先拥有索引的唯一原因是:

  1. 不允许其他事务看到没有索引的表(但在这种情况下,尝试在一个事务中创建表、填充表和创建索引)
  2. 索引支持约束,并且您希望在加载过程中而不是在最后强制执行约束。
  3. 您不太关心性能差异,并且预先创建索引在语法上更容易做到。

  • 除了速度更快之外,之后创建索引还会产生更紧凑、更高效的索引。通常只有一半的大小,因为它从一开始就作为一个平衡的 b 树创建,没有混乱的页面拆分等。你总是可以在批量加载后`REINDEX`,但是你要支付所有的 I/O创建索引的成本,然后丢弃并替换。(我希望 PostgreSQL 支持“禁用”索引,以便您可以创建它,但在启用/重新索引之前不能使用它) (2认同)