Обсуждение: VARCHAR(32) в VARCHAR(64) илиTEXT
Можно ли сконвертить на большой таблице сабж без блокировки ее? -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
Вложения
Привет Увеличить varchar можно, это затронет только системный каталог, т.е. быстро. Но блокировка от alter table на табличке всёравно будет. Попробуйте выполнить с таймаутом: set statement_timeout to '1s'; alter table tablename alter column varcharcolumn type varchar(64); Сергей 19.04.2018, 12:06, "Dmitry E. Oboukhov" <unera@debian.org>: > Можно ли сконвертить на большой таблице сабж без блокировки ее? > > -- > > . ''`. Dmitry E. Oboukhov <unera@debian.org> > : :’ : > `. `~’ GPG key: 4096R/08EEA756 2014-08-30 > `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
> Привет > Увеличить varchar можно, это затронет только системный каталог, т.е. быстро. Но блокировка от alter table на табличке всёравно будет. Попробуйте выполнить с таймаутом: > set statement_timeout to '1s'; > alter table tablename alter column varcharcolumn type varchar(64); > Сергей не, вешается запрос на длительный срок запрос зависает в disk состоянии (pg_top). видимо из за того что на это поле простроены индексы еще? -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
Вложения
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? Сергей
> 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
Вложения
Достал 9.5, с not null и уникальным индексом - все равно увеличивается varchar или меняется на text легко. Вот уменьшаться- бежит по табличке. Сейчас точно varchar(32)? А default есть?
> Достал 9.5, с not null и уникальным индексом - все равно увеличивается > varchar или меняется на text легко. Вот уменьшаться - бежит по табличке. > Сейчас точно varchar(32)? А default есть? orderid | character varying(32) | NOT NULL gid | integer | ex_messenger | text | и имеются индексы: "orders_gid_orderid_ukey" UNIQUE, btree (gid, orderid) "orders_ex_messenger_orderid_idx" btree (ex_messenger, orderid) WHERE ex_messenger IS NOT NULL > или меняется на text легко. в документации написано что varchar до 126 байт - это 1 байт + сама строка. то есть теоретически легко могло бы быть увеличение varchar в пределах 126 байт, а до text должно было бы требовать перестроения. но у меня перестраивает почему-то и даже varchar32 в varchar64 -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756