sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres - Är detta rätt sätt att skapa ett partiellt index på en boolesk kolumn?

Jag har bekräftat att indexet fungerar som förväntat.

Jag återskapade slumpmässiga data, bara den här gången ställde jag in diet_glutenfree till random() > 0.9 så det finns bara 10 % chans att on lite.

Jag skapade sedan om indexen och försökte frågan igen.

SELECT RecipeId from RecipeMetadata where diet_glutenfree;

Returnerar:

'Index Scan using idx_recipemetadata_glutenfree on recipemetadata  (cost=0.00..135.15 rows=1030 width=16)'
'  Index Cond: (diet_glutenfree = true)'

Och:

SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;

Returnerar:

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

Det verkar som att mitt första försök var förorenat eftersom PG uppskattar att det är snabbare att skanna hela tabellen snarare än att slå indexet om den ändå måste ladda över hälften av raderna.

Jag tror dock att jag skulle få dessa exakta resultat på ett fullständigt index över kolumnen. Finns det något sätt att verifiera antalet rader som indexeras i ett partiellt index?

UPPDATERA

Indexet är runt 40k. Jag skapade ett fullständigt index för samma kolumn och det är över 200 000, så det ser ut som att det definitivt är delvis.



  1. SQL:Gruppräkningar i individuella resultatrader

  2. Mysql - EXPLAIN SELECT från en VIEW tittar på alla rader i huvudtabellen

  3. Använda ett RESTful API för dynamiska webbplatser

  4. Använda bulk_update_mappings i SQLAlchemy för att uppdatera flera rader med olika värden