2011-04-07 62 views
1

我有一个查询来修改200万个postgres中的记录。
问题是,其中一个字段的类型是VARCHAR,我需要对它进行一些数学运算。现在我正在铸造领域的数字是这样的: -将varchar类型的postgres字段转换为数字

CAST(attribute as numeric) 

整个查询需要大约4小时运行。
我正在寻找方法来加快执行时间。在执行查询之前,我可以通过任何方式将字段类型从varchar更改为数字吗?我不能使用alter table alter column type来做到这一点。

+4

你可以试试[数据暂存到临时表(http://www.postgresql.org/files/documentation/books/aw_pgsql/node119.html): 'SELECT ... INTO TEMPORARY tbl FROM ...',然后更新回原始表。 – 2011-04-07 04:21:54

+1

您确定CAST()会减慢您的查询速度吗?你能向我们展示完整的查询和执行计划吗? – 2011-04-07 06:38:11

回答

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; 
相关问题