首页 > 解决方案 > postgresql:当行数非常大时,将一列复制到另一列中

问题描述

我有一张有数百万行的表。

我有一个名为time_from_device(类型为timezone with time stamp)的列

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

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

但在我将默认值设置created_at为 now() 之前,我想created_attime_from_device - INTERVAL '1 hour'

所以我正在做以下事情

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

这将创建一个created_at包含NULL值的新列

现在我想用时间值填充列time_from_device - INTERVAL '1 hour'

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

由于有数百万行,此命令只是挂起

我怎么知道它是否工作

标签: postgresql

解决方案


你这样做的方式是正确的。耐心一点。

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

您可以检查相应会话wait_eventpg_stat_activity行中的 :如果它为 NULL,则您的查询正常工作。

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

事务的大小在 PostgreSQL 中不是性能问题。


推荐阅读