Re: Add column with default value in big table - splitting of updatescan help?

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Add column with default value in big table - splitting of updatescan help?
Дата
Msg-id d6abdeb8-d40e-cbd3-db95-a037b8d343da@aklaver.com
обсуждение исходный текст
Ответ на Add column with default value in big table - splitting of updates can help?  (Durumdara <durumdara@gmail.com>)
Список pgsql-general
On 1/30/20 7:51 AM, Durumdara wrote:
> Dear Members!
> 
> I've read this article, but I need your experience in this theme.
> 
> https://leopard.in.ua/2016/09/20/safe-and-unsafe-operations-postgresql#.XjL3fcqYXDc
> 
> alter table tk
>    add colum field1 default 'MUCH';
> 
> The table tk have 200 million rows. The autovacuum is no problem, only 
> the long update.
> 
> But as I read the alter makes table lock, so this update locks the table 
> for long time.

What version of Postgres are you using?

I ask because:

https://www.postgresql.org/docs/11/release-11.html

"Many other useful performance improvements, including the ability to 
avoid a table rewrite for ALTER TABLE ... ADD COLUMN with a non-null 
column default"

> 
> The article said we need to do this:
> 
> 1. add column without default - fast.
> 2. set default on column.
> 3. update it where is null.
> 
> What we can save with this method?
> 
> As I suppose the table lock substituted with long update (row locks on 
> whole table).
> 
> The article suggested to replace long update to shorter sequences 
> (10000-100000 records by cycle).
> 
> We used to execute these SQL-s (alter, default, update) in one transaction.
> So I can't make commit there.
> 
> What is the difference between "full update" and "updates by 10000 
> records" when I'm in a single transaction?
> 
> Is it possible that this pseudo code makes less locks WITHOUT INNER COMMIT?
> 
> Pseudo:
> ----------------------
> begin
>    while True loop
>       update tk set field1 = ' MUCH' when field1 is NULL and id in
>          (select id from tk where field1 is NULL limit 100000);
>       if not FOUND then
>          break;
>    end while;
> end
>    ----------------------
> 
> Is there any advance when I split updates? I'm in one transaction.
> 
> TR. START
> ----
> 1. alter add col
> 2. set default
> 3. updates
> ---
> TR. COMMIT
> 
> Or it isn't help me?
> 
> Because the whole transaction locks the other users also, just like 
> "alter add colum wit hdefault statement"?
> 
> Thank you for your and help!
> 
> Best regards
>     dd


-- 
Adrian Klaver
adrian.klaver@aklaver.com



В списке pgsql-general по дате отправления:

Предыдущее
От: Durumdara
Дата:
Сообщение: Add column with default value in big table - splitting of updates can help?
Следующее
От: hubert depesz lubaczewski
Дата:
Сообщение: Re: Add column with default value in big table - splitting ofupdates can help?