Mamy tabelę z kolumną tablicy indeksowanej:Czy operator nakładający się na Postgres (&&) może używać indeksu?
CREATE TABLE mention (
id SERIAL,
phraseIds integer[],
PRIMARY KEY (id)
);
CREATE INDEX indx_mentions_phraseIds on mention USING GIN (phraseids public.gin__int_ops);
Zapytania za pomocą „nachodzi” operator w tej kolumnie nie wydają się korzystać z indeksu:
explain analyze select m.id FROM mention m WHERE m.phraseIds && ARRAY[11638,11639];
Seq Scan on mention m (cost=0.00..933723.44 rows=1404 width=4) (actual time=103.018..3751.525 rows=1101 loops=1)
Filter: (phraseids && '{11638,11639}'::integer[])
Rows Removed by Filter: 7019974
Total runtime: 3751.618 ms
Czy to możliwe, aby uzyskać PostgreSQL do korzystania z indeksu? A może powinniśmy robić coś innego?
Aktualizacja: powtórzyłem test z "SET enable_seqscan TO off", a indeks nadal nie jest używany.
Aktualizacja: Powinienem wspomnieć, że używam 9.2 z rozszerzeniem intarray.
Aktualizacja: Wygląda na to, że rozszerzenie typu intarray jest częścią tego problemu. Ponownie utworzyłem tabelę bez użycia rozszerzenia intarray, a indeks jest używany zgodnie z oczekiwaniami. Czy ktoś wie, jak uzyskać indeks do użycia z rozszerzeniem intarray? Dokumenty (http://www.postgresql.org/docs/9.2/static/intarray.html) mówią, że indeksy są obsługiwane dla & &.
Użyj 'USTAW enable_seqscan DO WYŁĄCZENIA' i zobacz najpierw jeśli PG * może * używać indeksu, powinno, a następnie, jeśli skanowanie indeksu będzie szybsze niż seq scan. Opublikuj wynik tutaj, proszę. – MatheusOl
Dlaczego przechowywanie * tablicy * numerów identyfikacyjnych w każdym rzędzie jest najlepszym projektem dla twojego stołu? –
Dane były wcześniej w MySQL i użyliśmy pewnej liczby oddzielnych kolumn (phrase0, phrase1, ...) do przechowywania danych. Używanie oddzielnej tabeli było bardzo powolne w MySQL (wiele milionów wierszy w obu tabelach i musimy sortować wynik i ograniczać). Używanie tablicy Postgresa wydawało się dobrą rzeczą. –