> melkij=> create table altervarchar(i int, v varchar(32));
> CREATE TABLE
> melkij=> insert into altervarchar select g, 'fdsfods' || g from generate_series(1,1e7) g;
> INSERT 0 10000000
> melkij=> create index on altervarchar (v);
> CREATE INDEX
> melkij=> set statement_timeout to '1s';
> SET
> melkij=> \timing
> Секундомер включён.
> melkij=> alter table altervarchar alter column v type varchar(64);
> ALTER TABLE
> Время: 1,530 мс
> melkij=> \dt+ altervarchar
> Список отношений
> Схема | Имя | Тип | Владелец | Размер | Описание
> ------------+--------------+---------+----------+--------+----------
> monitoring | altervarchar | таблица | melkij | 498 MB |
> (1 строка)
> Это 9.6 на HDD, за полторы мс полгигабайта не прожуют явно. Индекс как можно заметить не мешает сам по себе.
> А у вас какая версия и не отличается ли чем alter table?
у меня 9.5 и v not null поле.
по v построено несколько индексов (есть уникальный [gid::integer, v])
а так все остальное - так же
ALTER TABLE orders ALTER COLUMN "orderid" TYPE VARCHAR(64);
вешается запрос в статусе disk
13416 postgres 20 0 28G 13G disk 2:19 6.26% 28.04% postgres: tst tst 127.0.0.1(48588) ALTER TABLE
все прочие уходят в статус waiting и все.
дольше 30 секунд ждать не пытался - БД живая.
видимо придется через промежуточный столбик делать.
--
. ''`. Dmitry E. Oboukhov <unera@debian.org>
: :’ :
`. `~’ GPG key: 4096R/08EEA756 2014-08-30
`- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756