У меня есть следующая таблица:
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 раз.
UPDATE:
Я пошел дальше и добавил 10000 строк в RecipeMetadata со случайными значениями. Затем я сделал АНАЛИЗ на столе и РЕИНДЕКС, чтобы быть уверенным. Когда я запускаю запрос:
select recipeid from RecipeMetadata where diet_glutenfree;
Я получаю:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'
Итак, похоже, что выполняется последовательное сканирование таблицы, хотя только около половины строк имеют этот флаг. Индекс игнорируется.
Если я это сделаю:
select recipeid from RecipeMetadata where not diet_glutenfree;
Я получаю:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'
Так что, несмотря ни на что, этот индекс не используется.