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

postgresql:当行数很大时,将一列复制到另一列中

  •  0
  • Santhosh  · 技术社区  · 3 年前

    我有一张有数百万行的桌子。

    我有一个名为的专栏 time_from_device (属于类型 timezone with time stamp )

    id | name | t1 | t2 | t3 | time_from_device |
    ---------------------------------------------
    

    现在我想添加一个名为的列 created_at 其值将为 now()

    但在我设置默认值之前 创建日期 现在(),我想填充现有的行 创建日期 具有 time_from_device - INTERVAL '1 hour'

    所以我正在做以下事情

    ALTER TABLE devicedata ADD COLUMN "created_at" timestamp with time zone;
    

    这将创建一个新列 创建日期 具有 NULL 价值观

    现在我想用来自的时间值填充该列 time_from_device-间隔“1小时”

    UPDATE devicedata SET created_at = time_from_device - INTERVAL '1 hour';
    

    由于有数百万行,因此此命令将挂起

    我怎么知道它是否有效

    0 回复  |  直到 3 年前
        1
  •  0
  •   Laurenz Albe    3 年前

    你这样做的方式是正确的。只要有耐心。

    一个潜在的问题可能是并发长时间运行的事务造成的行锁。确保没有此类交易。

    您可以检查 wait_event 在中 pg_stat_activity 对应会话的行:如果为NULL,则表示您的查询工作正常。

    为了加快操作速度,您可以在更新表之前删除所有索引和约束,然后重新创建它们。无论如何,您的操作可能需要停机时间。

    事务的大小在PostgreSQL中没有性能问题。