2011-04-07 56 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; 
相關問題