Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] индекс & автовакуум? & как понять проблему?

Lists: Postg무지개 토토SQL :
From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: индекс & автовакуум? & как понять проблему?
Date: 2015-11-16 16:58:07
Message-ID: 20151116165807.GD11500@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

имеется большая таблица

id, status, ...

где status - поле enum

по некоторым причинам хотим преобразовать поле status в text

что делаем

1. добавили столбил status_text (NULL)

2. построили индекс

CREATE INDEX "upgrade_temp" ON "table" ("id") WHERE "status_text" IS NULL;

3. запустили скрипт который делает следующее

WITH "list" AS (
SELECT
"id"
FROM
"table"
WHERE
"status_text" IS NULL
LIMIT
500
)
UPDATE
"table"
SET
"status_text" = "status"::TEXT
FROM
"list"
WHERE
"list"."id" = "table"."id"
RETURNING
"list"."id"

и вот этот скрипт уже почти неделю работает вроде уже немного ему
осталось (где-то 7 млн из 40 млн переписать)

но вот такая фигня:

на реплике вижу что запрос

SELECT
min(id)
FROM
"table"
WHERE
"status_text" IS NULL

выполняется часами.

при этом EXPLAIN на этот запрос реплика показывает следующий

Result (cost=3.03..3.04 rows=1 width=0)
InitPlan 1 (returns $0)
-> Limit (cost=0.56..3.03 rows=1 width=4)
-> Index Scan using upgrade_temp on table (cost=0.56..31983942.31 rows=12973820 width=4)
Index Cond: (id IS NOT NULL)
(5 строк)

то есть план запроса у него вроде простой - выбрать из индекса, но
запрос тупо вешается.

При этом тот же запрос на мастере (можно сделать EXPLAIN ANALYZE):

Result (cost=3.03..3.04 rows=1 width=0) (actual time=1504.294..1504.295 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.56..3.03 rows=1 width=4) (actual time=1504.283..1504.284 rows=1 loops=1)
-> Index Scan using upgrade_temp on table (cost=0.56..31985330.81 rows=12974386 width=4) (actual time=1504.280..1504.280 rows=1 loops=1)
Index Cond: (id IS NOT NULL)
Total runtime: 1504.382 ms
(6 строк)

то есть видим

- целых полторы секунды тупит на мастере
- дополнительная информация: по мере апгрейда размер индекса не
падает, а продолжает расти

Когда начали апгрейд - размер индекса был 800 Мб, сейчас уже 900Мб,
хотя записей в нем теперь в 4 раза меньше чем в начале.

из описанной информации я заключаю следующее

1. индекс на диске пришел в какое-то состояние что он слишком
неэффективен (фрагментация или что-то еще)
2. возможно я видимо сделал ошибку что записи апдейтятся пачками по
500 штук. лучше было по 1-10. Насколько я помню автовакуум у нас не
справлялся с работой когда мы пачками обновления делали

но останавливать скрипт я сейчас не хочу (рестартить скрипт апгрейда
не хочется)

соответственно вопросы:

1. правильно ли мое предположение что с индексом что-то не то в плане
хранения на диске? как это можно посмотреть/оценить?
2. есть связь с автовакуумом итп?
3. как устроен автовакуум на репликах отличается как-то? где можно
почитать про это?

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: индекс & автовакуум? & как понять проблему?
Date: 2015-11-16 17:47:49
Message-ID: 20151116174749.GG11500@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg배트맨 토토SQL :

насчет фрагментации мысль подтвердилась:

перестроил CONCURENTLY индекс, а старый удалил - в итоге новый индекс
уже в 6 раз меньше занимает.

вопрос тогда еще: можно ли дефрагментировать один индекс как-то?
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Alexey Vasiliev <leopard_ne(at)inbox(dot)ru>
To: Dmitry E(dot) Oboukhov <unera(at)debian(dot)org>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re[2]: [pgsql-ru-general] индекс & автовакуум? & как понять проблему?
Date: 2015-11-16 20:54:48
Message-ID: 1447707288.858606470@f48.i.mail.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general


REINDEX INDEX

>Понедельник, 16 ноября 2015, 20:47 +03:00 от "Dmitry E. Oboukhov" <unera(at)debian(dot)org>:
>
>насчет фрагментации мысль подтвердилась:
>
>перестроил CONCURENTLY индекс, а старый удалил - в итоге новый индекс
>уже в 6 раз меньше занимает.
>
>вопрос тогда еще: можно ли дефрагментировать один индекс как-то?
>--
>
>. ''`. Dmitry E. Oboukhov
>: :’ : email: unera(at)debian(dot)org jabber: //UNera(at)uvw(dot)ru
>`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
>  `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Re[2]: [pgsql-ru-general] индекс & автовакуум? & как понять проблему?
Date: 2015-11-17 09:08:20
Message-ID: 20151117090820.GA8404@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general


> REINDEX INDEX

это я понимаю, я думал есть какая-то возможность сделать это не
блокируя базу.

>> Понедельник, 16 ноября 2015, 20:47 +03:00 от "Dmitry E. Oboukhov"
>> <unera(at)debian(dot)org>:

>> насчет фрагментации мысль подтвердилась:

>> перестроил CONCURENTLY индекс, а старый удалил - в итоге новый индекс
>> уже в 6 раз меньше занимает.

>> вопрос тогда еще: можно ли дефрагментировать один индекс как-то?
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Vladimir Borodin <root(at)simply(dot)name>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] индекс & автовакуум? & как понять проблему?
Date: 2015-11-17 09:52:22
Message-ID: 18D1B85B-08B3-4261-8CF2-BA9150DF12FA@simply.name
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general


> 17 нояб. 2015 г., в 12:08, Dmitry E. Oboukhov <unera(at)debian(dot)org> написал(а):
>
>
>> REINDEX INDEX
>
> это я понимаю, я думал есть какая-то возможность сделать это не
> блокируя базу.

Используй pg_repack, Люк.

>
>
>
>>> Понедельник, 16 ноября 2015, 20:47 +03:00 от "Dmitry E. Oboukhov"
>>> <unera(at)debian(dot)org>:
>
>>> насчет фрагментации мысль подтвердилась:
>
>>> перестроил CONCURENTLY индекс, а старый удалил - в итоге новый индекс
>>> уже в 6 раз меньше занимает.
>
>>> вопрос тогда еще: можно ли дефрагментировать один индекс как-то?
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

--
Да пребудет с вами сила…
https://simply.name/ru


From: Sergey Grinko <sergey(dot)grinko(at)gmail(dot)com>
To: Vladimir Borodin <root(at)simply(dot)name>, "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re[2]: [pgsql-ru-general] индекс & автовакуум? & как понять проблему?
Date: 2015-11-17 13:45:31
Message-ID: CAA8WaEG2YF0KkGBEc9Z4q4ccRcOUgT2wyX7r9SZrYb2Zz8RodA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg무지개 토토SQL :

pg_repack требует в два раза больше места чем есть, что не всегда можно
иметь.
Есть замечательный инструмент от компании PostgreSQL-Consulting
https://github.com/PostgreSQL-Consulting/pgcompacttable
по сути это скрипт на Perl
Это позволяет сжать таблицу + индексы в online.
Я кстати его запускаю на windows (ActivePerl), единственное столкнулся с
проблемой - функция getpwuid($<) (её просто нет в реализации под windows)
Поискав.. нашел решение - заменить на getlogin()
Заработало.

вт, 17 нояб. 2015 г. в 12:52, Vladimir Borodin <root(at)simply(dot)name>:

>
> 17 нояб. 2015 г., в 12:08, Dmitry E. Oboukhov <unera(at)debian(dot)org>
> написал(а):
>
>
>
> REINDEX INDEX
>
>
> это я понимаю, я думал есть какая-то возможность сделать это не
> блокируя базу.
>
>
> Используй pg_repack, Люк.
>
>
>
>
> Понедельник, 16 ноября 2015, 20:47 +03:00 от "Dmitry E. Oboukhov"
> <unera(at)debian(dot)org>:
>
>
> насчет фрагментации мысль подтвердилась:
>
>
> перестроил CONCURENTLY индекс, а старый удалил - в итоге новый индекс
> уже в 6 раз меньше занимает.
>
>
> вопрос тогда еще: можно ли дефрагментировать один индекс как-то?
>
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
>
>
> --
> Да пребудет с вами сила…
> https://simply.name/ru
>
> --
--
Yours faithfully, Sergey Grinko
Email: sergey(dot)grinko(at)gmail(dot)com