0

我在 Postgres 中创建了一组分区表,并开始通过主表插入大量行。当加载过程发生在我身上时,我意识到我应该声明 id 行 BIGSERIAL(BIGINT 带有序列,在幕后),但无意中将其设置为 SERIAL (INTEGER)。现在我已经加载了几十亿行,我正在尝试将列更改为 BIGINT。该过程似乎有效,但需要很长时间。所以,实际上,我真的不知道它是在工作还是挂起。我宁愿不再重新启动整个加载过程。

有什么建议么?

4

2 回答 2

1

当您在 PostgreSQL 中更新一行以更改它时,它会写出该行的一个新副本,然后稍后进行一些清理以删除原始副本。这意味着尝试通过更新来解决问题可能比从头开始重新加载所有数据要花费更长的时间——它比加载新副本需要更多的磁盘 I/O,并且还需要一些额外的处理时间。您想要进行更新而不是重新加载的唯一情况是原始加载效率非常低,例如,如果一个缓慢的客户端程序正在插入数据并且它是进程的瓶颈。

要确定该进程是否仍在工作,请查看它在运行 top(UNIX 系统)或任务管理器(Windows)时是否正在使用 CPU。在 Linux 上,“top -c”甚至会显示 PostgreSQL 客户端进程在做什么。您可能只是期望它比原始负载花费更少的时间,但它不会,而且它仍在运行而不是挂断。

于 2010-06-22T12:39:07.070 回答
0

重新启动它(澄清编辑:再次重新启动整个加载过程)。

更改列值需要新的行版本,并且所有指向旧版本的索引都要更新为指向新版本。

此外,请查看您可以遵循多少关于填充数据库的建议。


来自@archnid 的更正:

更改列的类型将触发表重写,因此行版本控制不是大问题,但仍会暂时占用大量磁盘空间。您通常可以通过查看数据库目录中的哪些文件被附加到...来监控进度...

于 2010-06-21T22:03:08.507 回答