62

是在加载数据完成之后还是之前创建索引更高效,还是没关系?

例如,假设我有 500 个文件要加载到 Postgres 8.4 数据库中。以下是我可以使用的两个索引创建方案:

  1. 创建表时创建索引,然后将每个文件加载到表中;或者
  2. 在所有文件都加载到表中后创建索引。

表数据本身约为 45 GB。该索引约为 12 GB。我正在使用标准索引。它是这样创建的:

CREATE INDEX idx_name ON table_name (column_name);

我的数据加载使用COPY FROM

加载所有文件后,表上将不会发生更新、删除或额外加载(这是一天的数据不会改变)。所以我想问哪种方案最有效?初步测试似乎表明加载所有文件然后创建索引(场景2)更快,但我没有对这两种方法进行科学比较。

4

1 回答 1

91

您的观察是正确的 - 先加载数据然后再创建索引更有效。原因是插入期间的索引更新很昂贵。如果在所有数据都存在之后创建索引,它会快得多。

它更进一步 - 如果您需要将大量数据导入现有索引表,通常先删除现有索引,导入数据,然后再次重新创建索引更有效。

导入后创建索引的一个缺点是表必须被锁定,并且可能需要很长时间(在相反的情况下不会被锁定)。但是,在 PostgreSQL 8.2 及更高版本中,您可以使用CREATE INDEX CONCURRENTLY,它不会在索引期间锁定表(有一些警告)。

于 2013-09-02T20:41:25.600 回答