Обсуждение: VARCHAR(32) в VARCHAR(64) илиTEXT

Поиск
Список
Период
Сортировка

VARCHAR(32) в VARCHAR(64) илиTEXT

От
"Dmitry E. Oboukhov"
Дата:
Можно ли сконвертить на большой таблице сабж без блокировки ее?

--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30
  `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756

Вложения

Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
Sergei Kornilov
Дата:
Привет
Увеличить 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


Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
"Dmitry E. Oboukhov"
Дата:
> Привет
> Увеличить 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

Вложения

Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
Sergei Kornilov
Дата:
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?

Сергей


Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
"Dmitry E. Oboukhov"
Дата:
> 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

Вложения

Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
Sergei Kornilov
Дата:
Достал 9.5, с not null и уникальным индексом - все равно увеличивается varchar или меняется на text легко. Вот
уменьшаться- бежит по табличке.
 
Сейчас точно varchar(32)? А default есть?


Re: VARCHAR(32) в VARCHAR(64) или TEXT

От
"Dmitry E. Oboukhov"
Дата:
> Достал 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

Вложения