|
Распухание индексов.
|
|||
---|---|---|---|
#18+
Добрый день, всем. Прошу дать совет, если у кого то есть опыт с распуханием индексов. Прочитал, что эту проблему вроде как хорошо доработали только в 12 версии. У меня версия 9.6 стоит, на 11м на другом сервере ситуация схожа. таблица 800мб, два индекса раздулись по 1.5Гб, то есть общий вес таблицы теперь 3.8Гб REINDEX в одном случае уменьшил вес индекса с 1.5Гб до 600мб, в другом с 1.5гб до 400мб, но это не большие объекты. В другой БД есть таблица на 1ТБ, на ней 4ре индекса, по 1.5Тб весом. То есть REINDEX будет выполняться неделю, что не допустимо. Какие варианты вы в принципе используете для борьбы с таким разростанием индексов и что примерно можно предпринять, при огромных объемах индексов? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2020, 20:07 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
kliff, Можно создать новый индекс, дублирующий распухший. Командой CREATE INDEX .. CONCURRENTLY. Убедившись, что новый индекс создался нормально (pg_index.indisvalid) можно удалить распухший старый. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2020, 21:27 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
kliff борьбы с таким разростанием индексов Настраивать автовакуум, убирать долгие транзакции (включая неявно приезжающие по hot_standby_feedback) Разбираться а не выкинуть ли из индекса чего-нибудь ненужное. До reindex concurrently индексы перестраивали методом create index concurrently + drop index concurrently. В обоих случаях полезно запастись maintenance_work_mem в сколько не жалко гигабайт. Для btree и postgresql 11+ ещё max_parallel_maintenance_workers. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2020, 22:45 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
Melkij +100 Ну и в целом. Ситуация, когда индекс весит сравнимо с таблицей вполне может иметь место. Все зависть от того что у Вас в этот индекс напихано. Если хотите чтоб было меньше - смотрите что можно выкинуть, а то люди часто насоздают индексов "на всякий случай". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2020, 23:00 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
mefman, Один - Делить таблицу через секции (это в 11 версии хорошо реализовано). Для каждой таблицы АВТОМАТИЧЕСКИ создается свой индекс. Уже можно работать не с одной большой таблицей а с кучей маленьких. . Два - подумать о само индексе. Я использую вместо btree индекс brin - хорошо для дат и времени (при условии, что таблица хорошо упорядочена). Для этого перестраиваю таблицу CLUSTER табл*** Таблица (секционная) около 600 тыс записей перестраивается за 0,1 сек (может и меньше - выдаёт 0,0 сек). Кстати, потом все работает в разы быстрее. Без CLUSTER = 1,7 сек, после CLUSTER = 0,1 сек Третье - чем чаще пишете в таблицу (меняете что то в ней) тем сильнее пухнет индекс. У меня таблица на 128 кб, но около 40'000 операций за 30 секунд в итоге выдают таблицу в 13 Мб и индекс в btree в 11 мб. После Reindex индекс получается 48 кб. Это к чему я - частые операции в отдельную таблицу а затем уже в архив (где операции редки). . Четвертое - не раздувать таблицу (не пихать все в одну большую), думать о полях и их значениях. Так можно сделать integer а можно сделать bigint. Разница в 4 байта. Считаем 4*600'000=2400'000 байт 38 таблиц = 91 Мб только в разнице по одному полю в моей БД. Таких полей 4 вот и получается на ровном месте 360 Мб, а к этому прибавьте еще раздутый индекс. . Но я бы начал с секционирования таблицы для сервера на котором PostgreSQL 11 версии и оптимизации полей индекса. Кстати, Reindex, так же как и CLUSTER запросто записывается в plpgsql и может обновляться маленькими частями (ночью или при маленькой нагрузке на сервер). Реально ускоряет работу БД и уменьшает её размер! . И да, если у вас есть временные таблицы с с индексами и вы часто с ними работаете, то лучше использовать DROP TABLE тогда удаляется все в ноль и все сразу (в том числе и индексы), затем создаёте заново с тем же названием. При использовании TRUNCATE индексы и все настройки остаются. Визуально, после DROP TABLE и создания новой таблицы с индексами она работает быстрее, чем через TRUNCATE. . ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 08:01 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
УТОЧНЕНИЕ ДЛЯ Два - подумать о само индексе. Я использую вместо btree индекс brin - хорошо для дат и времени (при условии, что таблица хорошо упорядочена). Здесь имелось ввиду, что использовать brin где это возможно. У себя использую btree - он реально работает быстрее раз в 8-10, а вот brin использую для вытаскивания данных из архива (один разу в сутки). При этом btree весит около 138 кб (после очистки), а brin 24кб (после очистки). Количество полей примерно одинаковое. . ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 08:32 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
Огромное всем спасибо. Полезная информация, буду думать, пробовать ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 08:34 |
|
Распухание индексов.
|
|||
---|---|---|---|
#18+
О-О-О И да, если у вас есть временные таблицы с с индексами и вы часто с ними работаете, то лучше использовать DROP TABLE тогда удаляется все в ноль и все сразу (в том числе и индексы), затем создаёте заново с тем же названием. При использовании TRUNCATE индексы и все настройки остаются. Визуально, после DROP TABLE и создания новой таблицы с индексами она работает быстрее, чем через TRUNCATE. . Эта информация для какой версии? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 16:05 |
|
|
start [/forum/topic.php?fid=53&msg=39971499&tid=1994631]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 445ms |
0 / 0 |