【问题标题】:How do I ALTER a set of partitioned tables in Postgres?如何在 Postgres 中更改一组分区表?
【发布时间】:2011-03-06 12:43:41
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: postgresql partitioning alter-table


    【解决方案1】:

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

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

    另外,看看你可以关注多少advise on populating databases


    来自@archnid的更正:

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

    【讨论】:

    • 好的。从您的回答中我不清楚您是否建议我重新启动服务器,或者我重做整个数据加载过程。您是否建议我重新加载数据库,因为 ALTERing 主表将花费大约相同的时间?
    • 我还应该添加...我的表上没有任何索引,甚至没有主键。
    • 我建议您重做整个加载过程,因为更改表格需要更长的时间。然而,完全没有索引确实消除了大规模批量更新的最大问题之一。剩下的问题是您需要两倍的磁盘空间,然后完成后,您的一半表将是空的。我最近没有使用大型继承表的经验,所以不知道这对决策有何影响。
    • 更改列的类型会触发表重写,所以行版本控制不是什么大问题,但它仍然会暂时占用大量磁盘空间。您通常可以通过查看数据库目录中的哪些文件被附加到...来监控进度...
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多