sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres - Er dette den rigtige måde at oprette et delvist indeks på en boolesk kolonne?

Jeg har bekræftet, at indekset fungerer som forventet.

Jeg genskabte de tilfældige data, men denne gang indstillede jeg diet_glutenfree til random() > 0.9 så der er kun 10 % chance for en on lidt.

Jeg genoprettede derefter indekserne og prøvede forespørgslen igen.

SELECT RecipeId from RecipeMetadata where diet_glutenfree;

Returnerer:

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

Og:

SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;

Returnerer:

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

Det ser ud til, at mit første forsøg var forurenet, da PG vurderer, at det er hurtigere at scanne hele tabellen i stedet for at ramme indekset, hvis den alligevel skal indlæse over halvdelen af ​​rækkerne.

Jeg tror dog, at jeg ville få disse nøjagtige resultater på et fuldt indeks af kolonnen. Er der en måde at verificere antallet af rækker, der er indekseret i et delvist indeks?

OPDATERING

Indekset er omkring 40k. Jeg oprettede et fuldt indeks over den samme kolonne, og det er over 200.000, så det ser ud til, at det helt sikkert er delvist.



  1. Postgresql - Opret database og tabel dynamisk

  2. Hent alle datoer mellem to datoer i SQL Server

  3. Skinner 3 - Ivrig lastning med betingelser

  4. SQL Server backup/gendannelse vs. frakoble/vedhæfte