Re: [pgsql-ru-general] GIN индекс - можно ли избавиться от Recheck?

From: Oleg Bartunov <obartunov(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, Teodor Sigaev <teodor(at)postgrespro(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] GIN индекс - можно ли избавиться от Recheck?
Date: 2016-05-09 15:31:48
Message-ID: CAF4Au4zrf=ej9Tt4m+E6R2S2MYmfKzge2UpzuV6ffVVfSjzr+w@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

2016-05-09 9:39 GMT+03:00 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
> имеется табличка
>
>> \d test
> Таблица "public.test"
> Колонка | Тип | Модификаторы
> ---------+---------+---------------------------------------------------
> id | integer | NOT NULL DEFAULT nextval('test_id_seq'::regclass)
> tags | text[] | NOT NULL
> Индексы:
> "test_pkey" PRIMARY KEY, btree (id)
>
>
> заполняем тестовую таблицу
>
>> INSERT INTO test
> SELECT
> generate_series(1, 10000000, 1) id,
> ARRAY[
> (ARRAY['abc', 'cde', 'def', 'ghi'])[1 + (random()*3)::INTEGER],
> (ARRAY['abc', 'cde', 'def', 'ghi'])[1 + (random()*3)::INTEGER]
> ] tags;
> INSERT 0 10000000
>
>> select count(*) FROM test;
> count
> ----------
> 10000000
> (1 строка)
>
> Строим GIN индекс
>
>> CREATE INDEX test_idx ON test USING GIN(tags);
> CREATE INDEX
>

Хочу добавить, что можно использовать COLLATION "C" для значительного
ускорения времени создания индекса.

CREATE INDEX test_idx ON test USING GIN(tags COLLATE "C");
CREATE INDEX
Time: 5800.975 ms

CREATE INDEX test_idx_ru ON test USING GIN(tags);
CREATE INDEX
Time: 19768.998 ms

У меня бывало и до 11 раз ускорение доходило. Правда придется потом
этот COLLATION "C" тащить и запросы, чтобы этот индекс использовался
:(
Раз в год на это натыкаюсь, все время забываем про это. Может к 9.7 не
забудем :)

>> EXPLAIN ANALYZE SELECT * FROM test WHERE tags @> ARRAY['abc', 'cde']::TEXT[];
> QUERY PLAN
> -------------------------------------------------------------------------------------------------------------------------------------
> Bitmap Heap Scan on test (cost=17511.01..131825.49 rows=1668518 width=41) (actual time=286.438..519.681 rows=1109868 loops=1)
> Recheck Cond: (tags @> '{abc,cde}'::text[])
> Heap Blocks: exact=93458
> -> Bitmap Index Scan on test_idx (cost=0.00..17093.88 rows=1668518 width=0) (actual time=271.244..271.244 rows=1109868 loops=1)
> Index Cond: (tags @> '{abc,cde}'::text[])
> Planning time: 0.665 ms
> Execution time: 552.225 ms
> (7 строк)
>
> В документации написано что Gin использует Recheck только когда
> используются веса, но тут никакие веса не используются.
> На recheck он потратил столько же времени сколько на выборку.
>
> можно ли от этого избавиться?

Recheck связан с bitmap-ом здесь. Analyzе всегда выдает recheck и надо
смотреть на строчку Heap Blocks: ...... В ваше случае recheck-а
реально не было, видно work_mem у вас приличного размера, так что
особенно оптимизировать нечего. А вот если у вас будет в этой строке
написано lossy=..., то тут и будет речек.

>
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlcwMKcACgkQq4wAz/jiZTcCfgCgiOlMaSZ/Fnz+P7f47wn8gXbp
> Px8AnRGaweMRvOOZ5epggb9E/Tdrhow/
> =XKEe
> -----END PGP SIGNATURE-----
>

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Dmitry E. Oboukhov 2016-05-10 07:17:16 Re: Re: [pgsql-ru-general] GIN индекс - можно ли избавиться от Recheck?
Previous Message Dmitry E. Oboukhov 2016-05-09 06:39:35 Re: GIN индекс - можно ли избавиться от Recheck?