альтернатива растровому индексу в postgresql - PullRequest
4 голосов
/ 29 сентября 2010

У меня есть таблица с сотнями миллионов строк со схемой, как показано ниже.

tabe AA {
 id integer primay key,
 prop0 boolean not null,
 prop1 boolean not null,
 prop2 smallint not null,
 ...
}

Каждое поле «свойство» (prop0, prop1, ...) имеет небольшое количество различных значений.И я обычно запрашиваю «id» из заданных условий полей свойств.Я думаю, что растровый индекс лучше всего подходит для этого запроса.Но postgresql, похоже, не поддерживает растровый индекс.

Я пробовал индекс b-дерева для каждого поля, но эти индексы не используются в соответствии с объяснением запроса.

Есть ли хороший альтернативный способ сделать это?

(я использую postgresql 9)

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Ваша настоящая проблема - плохой дизайн схемы, а не индекс.Свойства должны быть помещены в другую таблицу, а ваша текущая таблица должна ссылаться на эту таблицу, используя отношение «многие ко многим».

Также может быть полезен тип данных BIT, просто проверьте руководство .

1 голос
/ 30 сентября 2010

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

Альтернативой, когда вы не запрашиваете одни и те же свойства почти всегда, является создание столбца tsvector со словами, описывающими ваши данные, которые поддерживаются с использованием триггера, например

* 1006.*

будет

'propzero nopropone proptwo4'::tsvector

проиндексировать его, используя GIN, а затем использовать полнотекстовый поиск для поиска:

where tsv @@ 'popzero & nopropone & proptwo4'::tsquery
0 голосов
/ 29 сентября 2010

Индекс используется только в том случае, если он на самом деле ускоряет запрос, что не всегда так. Особенно для небольших таблиц (скажем, тысяч строк) полное сканирование таблицы («seq scan» в плане выполнения Postgres) действительно может быть намного быстрее.

Сколько строк в таблице было, когда вы пробовали оператор? Как выглядел запрос? Возможно, есть другие условия, которые мешают использованию индекса. Вы анализировали таблицу, чтобы иметь актуальную статистику?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...