将varchar类型的postgres字段转换为numeric

时间:2011-04-07 04:11:09

标签: sql postgresql

我有查询修改了200万条postgres记录 问题是该字段之一是VARCHAR类型,我需要对它进行一些数学运算。现在我正在将字段转换为数字: -

CAST(attribute as numeric)

整个查询大约需要4个小时才能运行 我正在寻找方法来加快执行时间。在执行查询之前,我可以以任何方式将字段类型从varchar更改为numeric吗?我不能使用alter table alter列类型来执行此操作。

1 个答案:

答案 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;