我有查询修改了200万条postgres记录
问题是该字段之一是VARCHAR
类型,我需要对它进行一些数学运算。现在我正在将字段转换为数字: -
CAST(attribute as numeric)
整个查询大约需要4个小时才能运行 我正在寻找方法来加快执行时间。在执行查询之前,我可以以任何方式将字段类型从varchar更改为numeric吗?我不能使用alter table alter列类型来执行此操作。
答案 0 :(得分:1)
如果你不能长时间阻止阅读表格,那么毫无疑问最好的approuch会创建一个“第二”表并进行后续更新,就像@OMG Ponies所说的那样。
此外,尝试禁用触发器,如果它们中的任何一个将使用新值执行某些操作(例如:log的触发器,因为我们没有更改它自己的“值”)。这可以大大提高性能,具体取决于触发器的功能。
这样的事情:
-- 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;