如果你不能長時間阻止閱讀表,那麼毫無疑問,最好的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;
你可以試試[數據暫存到臨時表(http://www.postgresql.org/files/documentation/books/aw_pgsql/node119.html): 'SELECT ... INTO TEMPORARY tbl FROM ...',然後更新回原始表。 – 2011-04-07 04:21:54
您確定CAST()會減慢您的查詢速度嗎?你能向我們展示完整的查詢和執行計劃嗎? – 2011-04-07 06:38:11