PostgreSQL:如果聚簇索引已经存在,那么新索引的CREATE INDEX会更快吗?

时间:2015-02-24 17:18:47

标签: sql database performance postgresql indexing

我的问题是关于数据加载过程中的性能。我需要在16亿行表上创建四个索引,我想知道以下哪一个更快:

  1. 创建索引,对其进行聚类,然后创建其他索引:

    CREATE INDEX i_col1 ON db.tbl USING btree (col1);
    CLUSTER db.tbl USING i_col1;
    CREATE INDEX i_col2 ON db.tbl USING btree (col2);
    CREATE INDEX i_col3 ON db.tbl USING btree (col3);
    CREATE INDEX i_col4 ON db.tbl USING btree (col4);
    
  2. 创建所有索引,然后聚集相同的第一个索引:

    CREATE INDEX i_col1 ON db.tbl USING btree (col1);
    CREATE INDEX i_col2 ON db.tbl USING btree (col2);
    CREATE INDEX i_col3 ON db.tbl USING btree (col3);
    CREATE INDEX i_col4 ON db.tbl USING btree (col4);
    CLUSTER db.tbl USING i_col1;
    

1 个答案:

答案 0 :(得分:2)

索引就像......一个索引!想象一本书的索引,它指定了其页面的内容。所以索引会向Postgres指出特定数据在磁盘上的位置。

当您执行CLUSTER操作时,Postgres将在物理上重新组织磁盘中的数据。

因此,基于该信息,选项1是最快的。请注意,如果在创建剩余的3个索引之前对数据进行聚类,则数据将在磁盘中彼此更接近,这将使Postgres更容易找到所需的数据,这将使索引创建更快。

但是,如果真的需要同一个表中的所有索引,请保留一些时间。索引太多可能比没有索引更糟糕。引用Postgres documentation

  

索引主要用于增强数据库性能(尽管   不当使用会导致性能降低。

此外,我不应该回答您的VACUUM问题,因为这不是本主题的内容,但如果您在CREATE INDEX之前执行VACUUM会更好,因为VACUUM会删除所有死元组,因此,您在创建索引时,将会有更少的垃圾进行迭代。有关VACUUM流程的更多信息,请查看this link