Oleg (obartunov) wrote,
Oleg
obartunov

Generate less WAL during GiST, GIN and SP-GiST index build

"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: #26, pg, wal
Subscribe

  • What is the size of jsonb ?

    It's interesting to know how big is your jsonb and it's not trivial as it looks, since jsonb is a binary format and also may be TOASTed (compressed).…

  • Partial TOAST decompression for jsonb

    Inspired by commit support for partial TOAST decompression "When asked for a slice of a TOAST entry, decompress enough to return the slice instead…

  • Bloom index for bigint

    Bloom index by default works for int4 and text, but other types with hash function and equality operator could be supported. Just use opclass…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments