我有查询要修改 postgres 中超过 200 万条记录。
问题是其中一个字段的类型为 VARCHAR
,我需要对其进行一些数学运算。现在我正在将字段转换为数字,如下所示:-
CAST(attribute as numeric)
整个查询大约需要 4 个小时才能运行。
我正在寻找缩短执行时间的方法。在执行查询之前,我可以先将字段类型从 varchar 更改为 numeric 吗?我不能使用 alter table alter column type 来执行此操作。
最佳答案
如果您不能长时间阻塞读取表,毫无疑问,最好的方法是创建“第二个”表并进行后续更新,如@OMG Ponies 所说。
此外,尝试禁用触发器,如果它们中的任何一个会用新值做某事(例如:日志的触发器,因为我们不会改变它自己的“值”)。这可以大大提高性能,具体取决于触发器的作用。
像这样:
-- STEP 1: CREATING SECOND TABLE
START TRANSACTION;
CREATE TABLE MY_SECOND_TABLE AS SELECT <YOURKEYFIELDNAME>, (ATTRIBUTE AS NUMERIC) AS ATTRIBUTE FROM MY_TABLE;
CREATE UNIQUE INDEX UI_MY_SECOND_TABLE ON MY_SECOND_TABLE (<YOURKEYFIELDNAME>);
COMMIT;
-- STEP 2: UPDATING A SOURCE TABLE
START TRANSACTION;
ALTER TABLE MY_TABLE DISABLE TRIGGER ALL;
ALTER TABLE MY_TABLE DROP COLUMN ATTRIBUTE;
ALTER TABLE ATTRIBUTE ADD ATTRIBUTE INTEGER;
UPDATE MY_TABLE T SET ATTRIBUTE = (SELECT ATTRIBUTE FROM MY_SECOND_TABLE T2 WHERE T2.<YOURKEYFIELDNAME> = T.<YOURKEYFIELDNAME>);
ALTER TABLE MY_TABLE ENABLE TRIGGER ALL;
COMMIT;
-- DROP SECOND TABLE
DROP TABLE MY_SECOND_TABLE;
关于sql - 将 varchar 类型的 postgres 字段转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575868/