2012-10-05 4 views
12

Исходя из моего предыдущего вопроса по этой теме, Postgres combining multiple Indexes:Postgres GIST против индекса ВТКЕЯ

Я следующая таблице на Postgres 9.2 (с 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 
); 

И я бегом следующим запроса на столе:

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 

Итак, учитывая, что то, что индекс следует использовать для (Coords + user_id), GIST или BTree?

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

ИЛИ

CREATE INDEX ix_coords_user_id ON updates (coords, user_id); 

Я читал, что BTree работает лучше, чем GIST, но я вынужден использовать GIST, так как я использую PostGIS поле географии ??

+0

Просьба показать «объяснить анализ» для обоих; вставьте планы на http://explain.depesz.com/ и напишите здесь. –

ответ

11

Вы должны использовать GiST, если вы хотите использовать любой метод индекса, отличный от обычных индексов дерева b (или индексов хеша, но они не должны действительно использоваться). Индексы PostGIS требуют GiST.

B-дерева индексы могут быть использованы только для основных операций, связанных с равенством или упорядоченность, как =, <, <=, >, >=, <>, BETWEEN и IN. Хотя вы можете создать индекс b-дерева для объекта геометрии (точки, региона и т. Д.), Его можно использовать только для равенства, поскольку сравнения сравнения, такие как >, вообще не имеют смысла для таких объектов. Индекс GiST необходим для поддержки более сложных и общих сравнений, таких как «содержит», «пересекает» и т. Д.

Вы можете использовать btree_gist extension, чтобы включить индексирование дерева для GiST. Это значительно медленнее, чем обычные индексы б дерев, но позволяет создать индекс из нескольких столбцов, которая содержит как GiST только типов и регулярные тип, как text, integer и т.д.


В таких ситуациях вам действительно нужны использовать explain analyze (explain.depesz.com), чтобы изучить, как Pg использует различные индексы и комбинации индексов, которые вы создаете. Попробуйте разные порядки столбцов в многоколоночных индексах и посмотрите, эффективны ли два или более отдельных индекса.

Я сильно подозреваю, что в этом случае вы получите наилучшие результаты с помощью многоколоночного индекса GiST, но я бы попробовал несколько разных комбинаций индексов и порядковых номеров индекса.

+0

Но я могу создать многоколоночный индекс на (coords, user_id), используя btree, поэтому не уверен, какое преимущество дает здесь более медленный индекс GIST? – kapso

+2

@ user310525 Просто потому, что вы можете создать индекс, это не значит, что он делает что-то полезное для вас. Изучите вывод 'explain analysis', чтобы узнать, какие индексы используются и как. Индексы B-дерева могут использоваться только для '=', '<', '<=', '>', '> =', '<>' и 'BETWEEN' - поэтому вполне вероятно, что это не делает ничего хорошего для части запроса PostGIS вашего запроса и вам будет лучше с одним столбцом b-tree index на '(user_id)'. –

+0

@ user310525 'ST_DWithin' документирован для использования любых доступных индексов геометрии, поэтому он должен извлечь выгоду из индекса GiST, но я сомневаюсь, что он может использовать какой-либо индекс b-дерева для типа геометрии, если только он не может провести сравнение равенства. –

Смежные вопросы