У меня есть следующая таблица:
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)'
Итак, несмотря ни на что, этот индекс не используется.