在Postgres中创建索引的最有效方法

时间:2013-09-02 20:36:24

标签: performance postgresql indexing

在加载数据完成之后或之前创建索引是否更有效,或者无关紧要?

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

  1. 创建表时创建索引,然后将每个文件加载到表中;或
  2. 在将所有文件加载到表格后创建索引。
  3. 表数据本身大约为45千兆字节。该指数约为12千兆字节。我正在使用标准索引。它是这样创建的:

    CREATE INDEX idx_name ON table_name (column_name);
    

    我的数据加载使用COPY FROM

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

1 个答案:

答案 0 :(得分:67)

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

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

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