代码之家  ›  专栏  ›  技术社区  ›  punkish

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

  •  0
  • punkish  · 技术社区  · 15 年前

    我在Postgres中创建了一组分区表,并开始通过主表插入许多行。当加载过程在我身上爆炸时,我意识到我应该声明ID行bigserial(bigint带有序列,在幕后),但不小心将其设置为serial(integer)。现在我已经加载了几十亿行,我正在尝试将列更改为bigint。这一过程似乎有效,但需要很长时间。所以,在现实中,我真的不知道它是工作的还是挂着的。我不想再重新启动整个加载过程。

    有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Eric Minkes    15 年前

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

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

    另外,看看 advise on populating databases 你可以跟着。


    @archnid更正:

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

        2
  •  1
  •   Greg Smith    15 年前

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

    要确定进程是否仍在工作,请在运行top(unix-ish系统)或task manager(Windows)时查看它是否在使用CPU。在Linux上,“top-c”甚至会向您展示PostgreSQL客户机进程在做什么。您可能只是希望它比原始加载所花费的时间更少,而这不会,而且它仍在运行,而不是挂断。