Есть БД 36 гб, на постгрес, 9,5 версии. В ней несколько таблиц. Одна из таблиц, приблизительно 18,5 млн записей; размер таблицы 8615 мб; tcoast 9984 кб; размер индексов 7794 мб. Ежедневно в таблице обновляется примерно 240 тысяч записей и удаляется примерно 90 тысяч. Также есть добавление записей (не знаю сколько).
Индексы стоят на 5 полей. Совсем недавно индексы в общем занимали 12 гб. Я создал новые индексы, затем удалил старые. Индексы стали меньше, но главное в пять раз быстрее стал обрабатываться тяжелый запрос (1 минута, вместо 5). Тогда я понял, что индексы вещь стоящая. Вопросы:
1. Сейчас я могу создать индекс только в pgadmin, так как у него во вкладке определение есть галочка "Неблокирующее создание". Как указать в sql запросе, что я хочу создать индекс без общей блокировки базы? То есть как изменить запрос?
CREATE INDEX CONCURRENTLY the_index ON public.the_bd (id_v_tablice ASC NULLS LAST);
Может правильнее reindex делать? Как его сделать неблокирующим? Не будет ли тормозов на выборку при переиндексации?
2. Как я понял postgresql чистит индексы от старых записей только если они оказываются в конце. Правильно ли я понял, что все админы время от времени вот так пересоздают индексы? Или есть более правильный путь?
3. У меня поля на индексах
-------------------------------------------------
1) данные в колонке char 32, потом будет заполнен весь, но хз когда это будет. индекс занимает 2564 мб
2) данные в колонке char 32, потом будет заполнен на половину, но хз когда это будет. индекс занимает 2529 мб
сейчас где то миллиона полтора записей заполнено в 1 колонке и 700 тысяч во второй.
3) данные в колонке char var 255, заполнен 100% уникальными записями. индекс занимает 2028 мб.
4) данные в колонке char 16, очень мало данных, типа 1 запись на тысячу пустых. индекс занимает 1758 мб
5) данные в колонке char 10, заполнен данными 100%, но не уникальные значения (несколько сотен строк). индекс занимает 580 мб.
-------------------------------------------------
Старые данные, по индексам.
Может под такие условия надо выбирать какие то иные типы индексов? Не btree, а hash, gist, gin, spgist, brin?
-------------------------------------------------
Первые два - решено.
1. неверно переписал команду. Внимательнее надо читать маны, она у меня в вопросе написана правильно.
2. Да, на больших таблицах с большим объемом добавления и удаления строк админы так и делают, создают новый индекс; удаляют старый; переименовывают (если надо) новый.
Как делают reindex в postgresql?
Модераторы: SLEDopit, Модераторы разделов
-
- Сообщения: 3684
- ОС: calculate linux, debian, ubuntu
-
- Сообщения: 1224
Re: Как делают reindex в postgresql?
1) CONCURRENTLY как раз и означает то, что вы хотите. Здесь очень хорошо описано https://www.postgresql.org/docs/9.5/static/...EX-CONCURRENTLY
2) Нет, так никто не делает. Судя по симптомам, у вас либо совсем отключён autovacuum, либо не подтюнены его настройки.
3) Не очень силён в типах индексов. Здесь вроде бы неплохо описаны типы индексов https://habrahabr.ru/post/102785/
2) Нет, так никто не делает. Судя по симптомам, у вас либо совсем отключён autovacuum, либо не подтюнены его настройки.
3) Не очень силён в типах индексов. Здесь вроде бы неплохо описаны типы индексов https://habrahabr.ru/post/102785/
Спасибо сказали:
-
- Сообщения: 3684
- ОС: calculate linux, debian, ubuntu
Re: Как делают reindex в postgresql?
skeletor спасибо, первые два вопроса решил.