Postgres - Это правильный способ создать частичный индекс для логического столбца?

У меня есть следующая таблица:

CREATE TABLE recipemetadata
(
  --Lots of columns
  diet_glutenfree boolean NOT NULL,
);

Почти каждая строка будет установлена ​​в FALSE , если кто-то не придумает какая-то безумная новая безглютеновая диета, которая охватила всю страну.

Мне нужно очень быстро запрашивать строки, в которых это значение истинно. Я создал индекс:

CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;

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

Следует ли мне добавить оператор в предложение WHERE , или этот синтаксис совершенно верен? Надеюсь, это не один из тех сверхлегких вопросов RTFM, за который 30 раз проголосуют против.

ОБНОВЛЕНИЕ:

Я пошел дальше и добавил в RecipeMetadata 10 000 строк со случайными значениями. Затем я сделал АНАЛИЗ на столе и REINDEX, чтобы быть уверенным. Когда я запускаю запрос:

выберите recipeid из RecipeMetadata, где diet_glutenfree;

Я получаю:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=5010 width=16)'
'  Filter: diet_glutenfree'

Итак, похоже, выполняется последовательное сканирование таблицы, хотя только около половины строк имеют этот флаг. Индекс игнорируется.

Если я это сделаю:

выберите recipeid из RecipeMetadata, где не diet_glutenfree;

Я получаю:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=5016 width=16)'
'  Filter: (NOT diet_glutenfree)'

Итак, несмотря ни на что, этот индекс не используется.

6
задан Mike Christensen 15 December 2011 в 06:47
поделиться