Postgres 中的索引生成

DDB*_*TTE 4 postgresql index disk-space

我们有一个包含大约 7 亿个条目的单个表的数据库。我们通过在服务器上添加新条目来更新数据库,然后使用 pg_dump 将服务器传输到生产服务器:

pg_dump -c 数据库 > /tmp/database_gen

(顺便说一下,我们使用 postgres 8.4)我们使用 psql 将数据库导出到生产服务器。pg_dump 生成的文件有关于如何创建和填充表的说明。

问题出在索引创建上。Postgres 填充表,然后花费数天时间创建索引。没关系,直到 postgres 无法再创建索引,因为它没有更多的磁盘空间,因为它使用大量磁盘空间来存储临时文件以进行排序和创建索引。通常数据库需要大约 200GB,但在创建索引期间,使用的磁盘空间增加到 600GB,然后在创建后又回到 200GB。

我的问题是:我们可以分几个步骤创建索引,比如为一半的表创建索引,然后添加表的其余部分并更新索引?

有没有人有同样的问题?

谢谢

Jac*_*las 8

如果在加载表之前创建索引,加载数据所花费的时间将显着增加。

预加载:

create table my_table1(val integer);
create index my_index1 on my_table1(val);
insert into my_table1(val) select generate_series(1,100000) order by random();
Time: 31755.858 ms
Run Code Online (Sandbox Code Playgroud)

后负载:

create table my_table2(val integer);
insert into my_table2(val) select generate_series(1,100000) order by random();
Time: 15344.130 ms
create index my_index2 on my_table2(val);
Time: 4073.686 ms
Run Code Online (Sandbox Code Playgroud)

如果你同意,pg_restore你可以:

  1. 仅加载架构使用 --schema-only
  2. 创建索引 --index
  3. 使用加载数据 --data-only

当然,“购买更多存储空间”很可能是这里的最佳答案......

  • 这不适用于他的情况,因为他使用的是 pg_dump,它在加载数据后已经创建了索引。它在问题中是这样说的。 (2认同)