Вопрос по intarrays и GIN/GIST индексам

From: Maxim Boguk <mboguk(at)masterhost(dot)ru>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Вопрос по intarrays и GIN/GIST индексам
Date: 2008-03-20 08:50:50
Message-ID: 47E2256A.8010206@masterhost.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

Собственно первый вопрос почему GIN индексы по intarray на postgres 8.3 просто не работают :(

vision=# \d vision_video
Таблица "public.vision_video"
Колонка | Тип | Модификаторы
-------------+-----------------------------+-----------------------------------------------------------------------
id | integer | not null default nextval(('public.documents_id_seq'::text)::regclass)
class | character varying(48) | not null
topic | integer[] |
...

vision=# SELECT count(*) from vision_video;
count
-------
90384
(1 запись)

vision=# CREATE INDEX CONCURRENTLY vision_video_topic_idx ON vision_video USING GIN(topic);
CREATE INDEX
vision=# EXPLAIN ANALYZE SELECT * FROM vision_video WHERE topic && ARRAY['112']::integer[];
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on vision_video (cost=0.00..16569.67 rows=90 width=1248) (actual time=0.089..142.912 rows=990 loops=1)
Filter: (topic && ('{112}'::text[])::integer[])
Total runtime: 147.815 ms
(3 rows)

там же через минуту:
vision=# CREATE INDEX CONCURRENTLY vision_video_topic1_idx ON vision_video USING GIST(topic);
CREATE INDEX
vision=# EXPLAIN ANALYZE SELECT * FROM vision_video WHERE topic && ARRAY['112']::integer[];
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using vision_video_topic1_idx on vision_video (cost=0.00..112.24 rows=90 width=1248) (actual time=0.084..7.374 rows=990 loops=1)
Index Cond: (topic && ('{112}'::text[])::integer[])
Total runtime: 12.186 ms
(3 rows)

Это первое... по логике GIN индекс должен быть быстрее но этого не наблюдается и он вообще не желает использоваться.
(analyze/reindex ситуацию не меняют)

Второе:
На аналогичной таблице имеем еще один intarray со следующими данными:

Опять же:
vision=# SELECT count(*) from vision_video;
count
-------
90384
(1 запись)

vision=# SELECT count(*) from vision_video where tags is not null and tags <> '{}';
count
-------
18115
(1 запись)
(тоесть совсем не много реально заполненных данных)

Средняя длинна тагов тоже маленькая:

vision=# SELECT avg(array_upper(tags,1)) from vision_video where tags is not null and tags <> '{}';
avg
--------------------
2.6531603643389456
(1 запись)

Совсем уникальных записей
vision=# SELECT count(distinct tags) from vision_video where tags is not null and tags <> '{}';
count
-------
10398
(1 запись)

GIN индекс по этому полю делается за 1-10 секунд... но не работает... см п1.

Создание же GIST индекса занимает черт знает сколько времени (сейчас уже вот 4 часа на серьезном сервере работает и грузит одно ядро на 100%).
Что делать и как вылечить ситуацию (записей смешное количество)?

--
Maxim Boguk

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Oleg Bartunov 2008-03-20 10:13:50 Re: Вопрос по intarrays и GIN/GIST индексам
Previous Message Ivan Zolotukhin 2008-03-07 22:00:08 Re: Думы по поводу count(*)