Потвърдих, че индексът работи според очакванията.
Създадох отново произволните данни, само че този път зададох diet_glutenfree
до random() > 0.9
така че има само 10% шанс за on
малко.
След това създадох отново индексите и опитах отново заявката.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Връща:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
И:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Връща:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Изглежда, че първият ми опит беше замърсен, тъй като PG смята, че е по-бързо да сканира цялата таблица, отколкото да удари индекса, ако така или иначе трябва да зареди повече от половината редове.
Мисля обаче, че ще получа тези точни резултати в пълен индекс на колоната. Има ли начин да се провери броят на редовете, индексирани в частичен индекс?
АКТУАЛИЗАЦИЯ
Индексът е около 40k. Създадох пълен индекс на същата колона и той е над 200k, така че изглежда, че определено е частичен.