Thread: Re: [pgsql-ru-general] GIN индекс: сортировка

Re: [pgsql-ru-general] GIN индекс: сортировка

From
Oleg Bartunov
Date:


2014-09-29 23:45 GMT+04:00 Dmitry E. Oboukhov <unera@debian.org>:
А еще по GIST может кто подскажет

такая база:

id, text

база оч большая (база из прошлого примера, просто все строки
сконкатенированы)

строим GIST на триграммах

CREATE INDEX "test_trgm_idx" ON "table"
    USING GIST (
        "text"
            "public"."gist_trgm_ops"
    );

Далее кладем в базу мнооого записей.

Далее запрос

SELECT
    *
FROM
    table
ORDER BY
    "text" <-> 'test'
LIMIT
    100


а WHERE "text" % 'test' влом написать ?
 

Работает, но меееееедленно:

EXPLAIN ANALYZE показывает такое:

Limit  (cost=0.67..209.06 rows=50 width=159) (actual time=36.071..2356.039 rows=50 loops=1)
  ->  Index Scan using test_trgm_idx on table (cost=0.67..23567041.91 rows=5654375 width=159) (actual time=36.070..2356.012 rows=50 loops=1)
        Order By: text <-> 'test'

Total runtime: 2356.102 ms
(4 строки)


Я чет не понимаю. по идее он должен был бы открыть итератор и идти от
наиболее похожих к наименее и взять первые 100.
а он весь индекс перебирает (то есть проку от индекса - 0, без индекса
работает столько же времени - 2 секунды)

Вопрос: что сделать чтобы уменьшить время работы?



--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.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)

iEYEAREDAAYFAlQptuUACgkQq4wAz/jiZTfPQwCgoKkY0zUsUI8RhgMTWm/Jcxa8
c/EAoLjfogCdI1E1g285HjN/zjG5djN3
=7kKh
-----END PGP SIGNATURE-----


Re: GIN индекс: сортировка

From
"Dmitry E. Oboukhov"
Date:
> а WHERE "text" % 'test' влом написать ?

Не, не влом, просто я полагал что ответ на вопрос "дай 100 ближайших"
делается именно так как я написал.



а этот оператор, что Вы предложили,  уменьшает время выполнения
запроса с 2.3 сек до 1.9 сек:

 Limit  (cost=0.92..216.20 rows=50 width=159) (actual time=38.617..1924.516 rows=50 loops=1)
    ->  Index Scan using test_trgm_idx on address (cost=0.92..24345.63 rows=5654 width=159) (actual
time=38.615..1924.494rows=50 loops=1) 
             Index Cond: text % 'test'
                      Order By: text <-> 'test'
(5 строк)

--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment