Potwierdzam, że indeks działa zgodnie z oczekiwaniami.
Odtworzyłem losowe dane, tylko tym razem ustawiłem diet_glutenfree
do random() > 0.9
więc istnieje tylko 10% szans na on
trochę.
Następnie odtworzyłem indeksy i ponownie spróbowałem zapytania.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Zwroty:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
Oraz:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Zwroty:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Wygląda na to, że moja pierwsza próba była zanieczyszczona, ponieważ PG szacuje, że szybciej jest przeskanować całą tabelę niż trafić w indeks, jeśli i tak musi załadować ponad połowę wierszy.
Myślę jednak, że uzyskałbym te dokładne wyniki na pełnym indeksie kolumny. Czy istnieje sposób na zweryfikowanie liczby wierszy zindeksowanych w indeksie częściowym?
AKTUALIZUJ
Indeks wynosi około 40 tys. Utworzyłem pełny indeks tej samej kolumny i ma on ponad 200 tys., więc wygląda na to, że jest zdecydowanie częściowy.