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

我的问题是关于数据加载过程中的性能问题。我需要在1.6十亿行的表创建四项指标,我想知道它下面的一个是速度快:PostgreSQL:如果聚簇索引已经存在,新索引的CREATE INDEX会更快吗?

  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;

回答:

索引的作用就像...索引!想想一本书的索引,它指定了它的页面内容。因此,索引将指向Postgres,该特定数据位于磁盘上。

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

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

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

索引主要用来提高数据库的性能(虽然可能导致性能不当使用)。

另外,我不应该回答你的真空问题,因为这不是这个话题是关于什么的,但它是更好,如果你执行CREATE INDEX前的真空,因为真空去除所有死者的元组因此,在创建索引时,您将不需要重复执行垃圾处理。请参阅this link了解有关VACUUM过程的更多信息。

以上是 PostgreSQL:如果聚簇索引已经存在,新索引的CREATE INDEX会更快吗? 的全部内容, 来源链接: utcz.com/qa/264917.html

回到顶部