postgresql - postgresql:当行数非常大时,将一列复制到另一列中
问题描述
我有一张有数百万行的表。
我有一个名为time_from_device
(类型为timezone with time stamp
)的列
id | name | t1 | t2 | t3 | time_from_device |
---------------------------------------------
现在我想添加一个名为的列created_at
,其值将是now()
但在我将默认值设置created_at
为 now() 之前,我想created_at
用time_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';
由于有数百万行,此命令只是挂起
我怎么知道它是否工作
解决方案
你这样做的方式是正确的。耐心一点。
一个潜在的问题可能是并发长时间运行的事务导致的行锁。确保没有此类交易。
您可以检查相应会话wait_event
的pg_stat_activity
行中的 :如果它为 NULL,则您的查询正常工作。
为了加快操作,您可以在更新表之前删除所有索引和约束,然后再次创建它们——无论如何,您的操作可能需要停机时间。
事务的大小在 PostgreSQL 中不是性能问题。
推荐阅读
- java - Elasticsearch High level Java Client version 6.0.1 实现基于脚本的排序
- javascript - 如何隐藏有条件的表格数据?
- javascript - 我们可以在模板文字(模板字符串)中使用 JS concat() 吗?
- haskell - 为什么在这种情况下读取函数不需要解析参数
- docker - Hazelcast 成员在 2 个不同的 docker 主机中
- node.js - 如何在没有唯一 ID 的情况下将数据保存在 Firebase 中?
- angular - CKEditor 4:如何在从 Angular CKEditor CDN 构建时添加自定义插件,如字数?
- python - 如何覆盖python元类方法?
- javascript - 中止 Dexie.js 查询
- xquery - Saxon xquery 验证失败 - 需要帮助来理解行为