172 похожих чатов

Ярослав, добрый вечер! Удалось пообщаться с Федором Сигаевым (напомню, что

это разработчик GIN индекса) касательно ограничений на maintenance_work_mem при CREATE INDEX для GIN (далее речь пойдет только о данном типе индекса), результаты весьма интересные:
1. Начнем с простого — гарантированно CREATE INDEX отработает при maintenance_work_mem не более чем 12GB;
2. Когда я уперся в INT_MAX, как оказалось, речь, в целом, шла не о кол-ве выделенной памяти под CREATE INDEX, а о размере posting list для конкретного частотного слова, то бишь кол-во ссылок на данное слово (право, есть грех, у меня присутствует частотное слово которое встречается более 2ккк раз, на досуге надо будет обязательно от него избавиться);
3. Таким образом, если бы частотного слова не было, то процесс бы успешно завершился, не смотря на то что maintenance_work_mem был бы на порядок больше чем 12GB, потому что каждый отдельно взятый posting list не превышал бы INT_MAX = 12GB;
4. Почему (1) работает? Потому что CREATE INDEX в таком случае сделает построение за несколько циклов "накопить в памяти — сбросить на диск", и в каждом цикле posting list count будет гарантированно влезать в INT_MAX;
5. Почему PostgreSQL при старте не ограничивает maintenance_work_mem <= 12GB довольно просто: потому что данный резерв используется не только для построения индексов GIN, но и для всяких VACUUM и т.д., где больший объем памяти мог бы пригодиться.

Теперь касательно моих наблюдений, не входящих в сессию общения с Сигаевым:
1. Как ни странно, при maintenance_work_mem = 12GB GIN индекс строится на 20-25% быстрее. Но это только в моём конкретном случае, впрочем;
3. Никакой крупной "утечки" не было, индекс в моём случае действительно целиком влезал в RAM (такое поведение также подтвердил Федор);
2. А, ну и всё. Ждем parallel workers для построения индексов не только типа b-tree, а то на одном ядре тяжко.

1 ответов

15 просмотров

Т.е. код мы с Вами прочитали правильно, в общем-то (п.1 — п.3 видно прямо в том коде; про п.4 я просто догадывался, код не смотрел; 5 — логично). Но, вообще, было бы неплохо, если бы это ограничение сняли, как видно. ;) > . Никакой крупной "утечки" не было, индекс в моём случае действительно целиком влезал в RAM А, т.е. posting lists строятся не по одному, получается? Если так — ещё лучше (на эту тему код я вообще не читал). Спасибо за информацию!

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта