?

Log in

No account? Create an account

...

или внеочередные заметки


Previous Entry Share Next Entry
Generate less WAL during GiST, GIN and SP-GiST index build
trekking, Himalaya
obartunov
"Instead of WAL-logging every modification during the build separately,
first build the index without any WAL-logging, and make a separate pass
through the index at the end, to write all pages to the WAL. This
significantly reduces the amount of WAL generated, and is usually also
faster, despite the extra I/O needed for the extra scan through the index.
WAL generated this way is also faster to replay."

Идея простая, уже не помню, кому она пришла в голову,помню что родилась она когда мы мучались с большим трафиком при создании RUM-индекса, трафик там гигантский был (https://obartunov.livejournal.com/189690.html), потому что для расширения используется generic WAL, который достаточно тупой и не понимает смещения. Поэтому для RUM мы так и сделали, пишем wal специальным проходом после создания индекса (http://www.sai.msu.su/~megera/postgres/talks/fosdem-fts-2016.pdf, слайд #26). Теперь так же делается и для GiST, GIN и SP-GiST.

Для демонстрации пользы патча (gin индекс) я использовал базу imdb в json формате, можно скачать у меня для экспериментов http://www.sai.msu.su/~megera/postgres/files/imdb-27-01-2017-json.dump.gz

\dt+ imdb
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+---------+-------------
public | imdb | table | postgres | 2938 MB |
(1 row)
SELECT pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
1/2E8B448
(1 row)
create index on imdb using gin(jb jsonb_path_ops);
CREATE INDEX
Time: 205115.236 ms (03:25.115)
SELECT pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
1/CAFCB638
(1 row)
SELECT pg_size_pretty(pg_wal_lsn_diff('1/CAFCB638','1/2E8B448'));
pg_size_pretty
----------------
3201 MB
(1 row)

Аналогично сделал для версии после этого коммита:

reate index on imdb using gin(jb jsonb_path_ops);
CREATE INDEX
Time: 133554.225 ms (02:13.554)

SELECT pg_size_pretty(pg_wal_lsn_diff('0/CA9EC558','0/B13C4070'));
pg_size_pretty
----------------
406 MB
(1 row)


Выводы:
Трафик уменьшился в 8 раз, что привело к уменьшению времени построения индекса с 200 сек для 133 сек, ну очень полезный комит !
Tags: , ,