如何在Postgres中更改一组分区表?

时间:2010-06-21 20:52:40

标签: postgresql partitioning alter-table

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

要确定进程是否仍然有效,请查看它在运行top(UNIX-ish系统)或任务管理器(Windows)时是否使用CPU。在Linux上,“top -c”甚至可以向您展示PostgreSQL客户端进程正在做什么。你可能只是期望它花费的时间少于原来的负载,它不会,并且它仍在运行而不是挂断。

答案 1 :(得分:0)

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

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

此外,请查看您可以关注的advise on populating databases的数量。


来自@archnid的更正:

  

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