在加载数据完成之后或之前创建索引是否更有效,或者无关紧要?
例如,假设我有500个文件要加载到Postgres 8.4 DB中。以下是我可以使用的两个索引创建方案:
表数据本身大约为45千兆字节。该指数约为12千兆字节。我正在使用标准索引。它是这样创建的:
CREATE INDEX idx_name ON table_name (column_name);
我的数据加载使用COPY FROM。
一旦加载了所有文件,表格上就不会发生更新,删除或额外加载(这是一天不会改变的数据)。所以我想问哪种情况最有效?初步测试似乎表明加载所有文件然后创建索引(方案2)更快,但我没有对这两种方法进行科学比较。
答案 0 :(得分:67)
您的观察是正确的 - 首先加载数据然后再创建索引要高效得多。原因是插入期间的索引更新很昂贵。如果在所有数据存在后创建索引,则速度会快得多。
更进一步 - 如果您需要将大量数据导入现有的索引表,首先删除现有索引,导入数据,然后再次重新创建索引通常会更有效。
导入后创建索引的一个缺点是该表必须被锁定,这可能需要很长时间(在相反的情况下不会被锁定)。但是,在PostgreSQL 8.2及更高版本中,您可以使用CREATE INDEX CONCURRENTLY,它在索引期间不会锁定表(有一些警告)。