|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Привет. Есть таблица с колонкой: "timestamp" date NOT NULL DEFAULT now(), Есть индекс на эту колонку: CREATE INDEX idx_timestamp ON table USING btree ("timestamp"); Размер таблицы 1,7 ГБ, размер данного индекса 19 ГБ Профиль нагрузки - Insert/Update (1 к 30 примерно) С вакуумом проблем нет, таблица регулярно подчищается - autovacuum_vacuum_scale_factor = 0.05 pgstattupple вот что показывает: Код: plsql 1. 2. 3. 4.
Ручной вакум: Код: sql 1. 2. 3. 4. 5.
Я изучил основные запросы - данное поле не участвует в операциях update. Я правильно понимаю механизм изменения данных в индексе: update = delete+insert, соответственно по факту создается новая строка, то куда она помещается в индекс? Если ключ индекса не изменился и в странице есть место(или страница совсем пустая должна быть?), данные вставляются на ту же самую страницу. Если ключ изменился (поле timestamp изменили), то новое значение должно быть помещено в соответствии с новым значением на другую страницу индекса. В моем случае поле timestamp не апдейтится, и как я полагаю, индекс не должен вообще меняться (кроме как наращиваться за счет INSERT). Подозреваю все же, при апдейте, даже не измененный ключ индекса не вставится в полу-пустую страницу. Я прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 09:48 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
gav21, индекс при update не будет изменяться, в случае если сработает hot update, для которого необходимо чтобы ни одна из изменяемых колонок не входила ни в какой индекс. какая доля от всех update является hot можно посмотреть в pg_stat_user_tables. а точно не бывает никаких долгих транзакций? pg_dump многочасовой например? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 10:07 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Alexius, hot_update для данной таблицы равен нулю, т.к. есть еще индекс по полю которое изменяется. Длинных транзакций нет, idle_in_transaction_session_timeout = 10 min pg_dump один раз в неделю дампит около 3 часов, не более. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 10:19 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
gav21, при интенсивных update'ах может и 3х часов достаточно чтобы индекс так распух. попробуйте перестроить индекс и понаблюдать за его размером и долгими транзакциями. возможно как-то можно убрать из индекса колонку, которая часто обновляется чтобы hot updates заработали. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 10:51 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Alexiusgav21, индекс при update не будет изменяться, в случае если сработает hot update, для которого необходимо чтобы ни одна из изменяемых колонок не входила ни в какой индекс. какая доля от всех update является hot можно посмотреть в pg_stat_user_tables. а точно не бывает никаких долгих транзакций? pg_dump многочасовой например? наверное "дерево не будет меняться" (баланситься и т.п.). а вот цтидов на листе индекса должно появиться новых. нет ? а то как-то неясно получается -- цтид сменился, а указывающий на него через IndexTupleData (т-тид) индекс -- нет. чота я туплю. /* 2 вар-та -- прокладка (вирт тиды в цтиды), и неточность форм-ки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 13:21 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
qwwq, при hot update индекс может не меняться совсем (проверил тестом на всякий случай с Код: sql 1. 2. 3. 4. 5.
с первым hot update хеш сменился - возможно какой-то флаг выставился, не уверен; в последующих - не менялся). указатель в индексе идет на старую версию строки и в самой строке есть указатель на более свежую строку на той же странице, таким образом выстраивается hot цепочка. вот тут подробнее про hot , в документации сходу не нашел ничего почему-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 14:00 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Alexiusqwwq, ... указатель в индексе идет на старую версию строки и в самой строке есть указатель на более свежую строку на той же странице, таким образом выстраивается hot цепочка. вот тут подробнее про hot , в документации сходу не нашел ничего почему-то. т.е. прокладка через олд-запись. кстати: уж лучше наверное без такого хота чем подбирать за страничкой страничку по цепочке. нет ? или при смене страницы это дело прерывается ? (пока не все просмотрел) ага, всё предусмотрено: авторIf an update changes any indexed column, or there is not room on the same page for the new tuple , then the HOT chain ends т.е. при отсутствии возможности вакуумиться маленькие плотно апдейтуемые таблички (например текущей активности и логлоков) обречены пухнуть индексами. т.к. хот насыщается. кейс убера, или часть кейса. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 14:20 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Alexius, индекс пухнет ежедневно, а дамп снимается только ночью длинные транзакции исключены (в т.ч в idle in tran), это мониторится Убрать из индекса колонку пока нет возможности Нашел похожую ситуацию у Максима https://www.postgresql.org/message-id/flat/CAK-MWwSmR7Tb2%2Bj__d5vb99%2Bk45rT%3DxmoRPFxmnW8drb4H87PQ%40mail.gmail.com#CAK-MWwSmR7Tb2+j__d5vb99+k45rT=xmoRPFxmnW8drb4H87PQ@mail.gmail.com]https://www.postgresql.org/message-id/flat/CAK-MWwSmR7Tb2 j__d5vb99 k45rT=xmoRPFxmnW8drb4H87PQ@mail.gmail.com#CAK-MWwSmR7Tb2 j__d5vb99 k45rT=xmoRPFxmnW8drb4H87PQ@mail.gmail.com Так понимаю особенность профиля нагрузки, высокофрагментированные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 15:04 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
qwwqт.е. при отсутствии возможности вакуумиться маленькие плотно апдейтуемые таблички (например текущей активности и логлоков) обречены пухнуть индексами. т.к. хот насыщается. кейс убера, или часть кейса. Лечится через комбинацию 1)установку fillfactor у таблицы в 50%-25% (если она разумного размера) и 2)установку кастомных предельно агрессивных параметров autovacuum для конкретных проблемных таблиц (вплоть до autovacuum_vacuum_scale_factor=0 и регулировку срабатывания autovacuum через autovacuum_vacuum_threshold) - пока хватало во всех случаях. PS: а если workers у autovacuum не хватает - это уже должно мониторится и если больше 10 минут все autovacuums заняты были то это повод или delay уменьшить у них или больше workers сделать. PPS: а автору топика - если такое возникает то перестроить индекс руками через конкурентное создание нового индекса и конкурентный дроп старого... если через неделю индекс опять распух - поставить pg_repack по этой таблице в крон с нужной частотой (да бывают ситуации когда индексы пухнут и ничего особо не сделать кроме как перестраивать время от времени). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 15:07 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Maxim Boguk, Максим спасибо, за совет. Мне непонятна механика распухания в данном случае. Почему он пухнет если изменений по ключу данного индекса не происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 15:18 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
gav21Maxim Boguk, Максим спасибо, за совет. Мне непонятна механика распухания в данном случае. Почему он пухнет если изменений по ключу данного индекса не происходит? потому, что рано или поздно при частом апдейте версия меняет блок. а тогда ссылка по ХОТ становится неэффективной, и надо писать новый цтид в сам лист индекса. (а не в прокладку по хот) отсутствие долго простаивающих транз и отсутствие долгих транз -- немного разные вещи. кстати, хот мешает вовремя вакуумиться самой табле -- т.е. снижает собственную эффективность. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 15:28 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
qwwqgav21Maxim Boguk, Максим спасибо, за совет. Мне непонятна механика распухания в данном случае. Почему он пухнет если изменений по ключу данного индекса не происходит? потому, что рано или поздно при частом апдейте версия меняет блок. а тогда ссылка по ХОТ становится неэффективной, и надо писать новый цтид в сам лист индекса. (а не в прокладку по хот) отсутствие долго простаивающих транз и отсутствие долгих транз -- немного разные вещи. кстати, хот мешает вовремя вакуумиться самой табле -- т.е. снижает собственную эффективность. У автора топика нет вообще HOT updates. Т.е. все update - реально delete+insert. Индекс распухший в 2 раза - это нормальное поведение (т.е. я в такой ситуации даже не перестраиваю обычно), больше 2х раз - уже выгоднее перестроить. Даже если значение не изменилось - то надо новую запись в индекс добавить, и надо понимать что добавлять новые записи в те страницы индекса где были удаленные данные (полупустые) - нельзя (если там хоть 1 активная запись на 1 страницу индекса осталась - это место не будет reused). Можете считать что у вас каждый update меняет поле индекса (физика процесса именно такая получается). "Подозреваю все же, при апдейте, даже не измененный ключ индекса не вставится в полу-пустую страницу. " - именно, поэтому предельное распухание индекса - по 1 живой записи на 8kb страницу индекса (т.е. где то в 400 раз в пределе наверное ;)). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 15:56 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
gav21, если у вас hot update вообще нет т.к. постоянно изменяется один из проиндексированных столбцов (n_tup_upd на мастере 0), то при каждом update в индекс происходит вставка. работы в этом направлении вроде велись, чтобы не обновлять все индексы, кроме тех, в которых меняются поля ( https://www.postgresql.org/message-id/flat/CABOikdMNy6yowA%2BwTGK9RVd8iw%2BCzqHeQSGpW7Yka_4RSZ_LOQ%40mail.gmail.com#CABOikdMNy6yowA+wTGK9RVd8iw+CzqHeQSGpW7Yka_4RSZ_LOQ@mail.gmail.com]WARM ), но чем это закончилось - я не в курсе. qwwq кстати, хот мешает вовремя вакуумиться самой табле -- т.е. снижает собственную эффективность. он откладывает обычный автовакуум, но в тоже время при обычной работе может происходить мини вакуум на странице, при котором схлопывание цепочек происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 16:19 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
Alexiusqwwq кстати, хот мешает вовремя вакуумиться самой табле -- т.е. снижает собственную эффективность. он откладывает обычный автовакуум, но в тоже время при обычной работе может происходить мини вакуум на странице, при котором схлопывание цепочек происходит. неправильно они, дядя федор, прокладку сделали.индекс должен показывать на страницу данных по псевдотиду. страница должна содержать сегментик--прокладку разадресации --( псевдотид -- лист тидов) той же странички. например. тогда факуумить записи можно в любое время. и разадресатор курочить, ессно. никто никого не держит. но, не для 30:1 это дорого, да. и уж больно кардинально. хммм. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2018, 20:25 |
|
Пухнет индекс
|
|||
---|---|---|---|
#18+
https://habrahabr.ru/company/devconf/blog/353682/ причесали, явных блох от убера с ""секондари индексами " в пж" вычесали . стало возможно читать не плюясь в авторов в каждой их сентенции. полезное чтиво про механизмы опухания. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2018, 12:46 |
|
|
start [/forum/topic.php?fid=53&fpage=56&tid=1995823]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 290ms |
total: | 423ms |
0 / 0 |