如果你不能长时间阻止阅读表,那么毫无疑问,最好的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