Преобразовать поле postgres типа varchar в числовое - PullRequest
1 голос
/ 07 апреля 2011

У меня есть запрос на изменение 2 миллионов записей в postgres.
Проблема в том, что одно из полей имеет тип VARCHAR, и мне нужно сделать некоторые математические операции над ним. Прямо сейчас я преобразовываю поле в числовое значение так: -

CAST(attribute as numeric)

Весь запрос занимает около 4 часов.
Я ищу способы закрепить тогда время выполнения. Можно ли каким-либо образом изменить тип поля с varchar на числовое, прежде чем выполнить запрос? Я не могу использовать alter table alter type для этого.

1 Ответ

1 голос
/ 04 июня 2012

Если вы не можете заблокировать таблицу для чтения в течение такого долгого времени, нет сомнений, что лучший способ - создать «вторую» таблицу и выполнить последующее обновление, как сказал @OMG Ponies.

Кроме того, попробуйте отключить триггеры, если какой-либо из них будет что-то делать с новым значением (например, триггер журнала, так как мы не изменяем само «значение»).Это может значительно повысить производительность, в зависимости от того, что делают ваши триггеры.

Примерно так:

-- 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...