2012-10-05 9 views
12

W nawiązaniu do mojego poprzedniego pytania na ten temat, Postgres combining multiple Indexes:Postgres GIST vs indeksu btree

mam następującą tabelę na PostgreSQL 9.2 (z PostGIS):

CREATE TABLE updates (
    update_id character varying(50) NOT NULL, 
    coords geography(Point,4326) NOT NULL, 
    user_id character varying(50) NOT NULL, 
    created_at timestamp without time zone NOT NULL 
); 

I używam następujące kwerendy na stole:

select * 
from updates 
where ST_DWithin(coords, ST_MakePoint(-126.4, 45.32)::geography, 30000) 
and user_id='3212312' 
order by created_at desc 
limit 60 

Więc biorąc pod uwagę, że co Index należy używać do (koordy + user_id), GIST lub btree?

CREATE INDEX ix_coords_user_id ON updates USING GIST (coords, user_id); 

LUB

CREATE INDEX ix_coords_user_id ON updates (coords, user_id); 

czytałem że btree działa lepiej niż GIST, ale jestem zmuszony do korzystania z GIST, ponieważ używam pole geografii postgis ??

+0

Proszę pokazać "wyjaśnij analizę" dla obu; wklej plany na http://explain.depesz.com/ i link do nich tutaj. –

Odpowiedz

11

Musisz użyć GiST, jeśli chcesz użyć jakiejkolwiek metody indeksowania innej niż zwykłe indeksy b-tree (lub indeksy hash, ale tak naprawdę nie powinny być używane). Indeksy PostGIS wymagają GiST.

indeksy B-drzewa mogą być wykorzystywane jedynie do podstawowych operacji dotyczących równości ani kolejnosci, jak =, <, <=, >, >=, <>, BETWEEN i IN. Chociaż można utworzyć indeks b-tree na obiekcie geomeryzacji (punkt, region itp.), Można go używać tylko dla równości, ponieważ porównywanie zamówień, takie jak >, jest zasadniczo bez znaczenia dla takich obiektów. Indeks GiST jest wymagany do obsługi bardziej złożonych i ogólnych porównań, takich jak "zawiera", "przecina" itp.

Możesz użyć btree_gist extension, aby włączyć indeksowanie drzewa B dla GiST. To znacznie wolniej niż zwykłe indeksy B-drzewa, ale pozwala na tworzenie indeksu wielu kolumn, który zawiera oba typy Gist-tylko i regularne typy jak text, integer itd


w takich sytuacjach naprawdę potrzebują do korzystania z explain analyze (explain.depesz.com jest przydatna do tego) do zbadania, w jaki sposób Pg używa różnych indeksów i kombinacji indeksów, które tworzysz. Wypróbuj różne uporządkowanie kolumn w indeksach wielokolumnowych i sprawdź, czy dwa lub więcej oddzielnych indeksów jest bardziej efektywne.

Podejrzewam, że w tym przypadku uzyskasz najlepsze wyniki z indeksem wielostrumieniowym GiST, ale spróbuję wyświetlić kilka różnych kombinacji indeksów i kolejności kolumn w indeksie.

+0

Ale jestem w stanie utworzyć indeks wielu kolumn na (coords, user_id) przy użyciu btree, więc nie wiesz, jaką korzyść ma tutaj wolniejszy indeks GIST? – kapso

+2

@ user310525 To, że możesz utworzyć indeks, nie oznacza, że ​​robi coś pożytecznego dla ciebie. Zbadaj dane wyjściowe 'explain analyze', aby sprawdzić, które indeksy są używane i w jaki sposób. Indeksy B-drzewa mogą być używane tylko dla '=', '<', '<=', '>', '> =', '<>' i 'BETWEEN' - więc prawdopodobnie nie przynosi to żadnej korzyści dla części PostGIS zapytania i lepiej byłoby, gdyby indeks pojedynczego drzewa kolumn miał postać '(id_użytkownika)'. –

+0

@ user310525 'ST_DWithin' jest udokumentowany, aby używać wszelkich dostępnych indeksów geometrii, więc powinien korzystać z indeksu GiST, ale wątpię, czy może on użyć dowolnego indeksu b-tree w typie geometrii, chyba że może dokonać porównania równości. –

Powiązane problemy