Ho la seguente tabella:Postgres: è questo il modo giusto per creare un indice parziale su una colonna booleana?
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
La maggior parte ogni riga verrà impostato su FALSE
a meno che qualcuno esce con qualche pazzo dieta priva di glutine nuovo che spazza il Paese.
Devo essere in grado di interrogare molto rapidamente le righe in cui questo valore è true. Ho creato l'indice:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
E sembra funzionare, ma io non riesco a capire come dire se in effetti è solo indicizzazione righe in cui il valore è true. Voglio assicurarmi che non stia facendo qualcosa di sciocco come l'indicizzazione di qualsiasi riga con qualsiasi valore.
Devo aggiungere un operatore alla clausola WHERE
oppure questa sintassi è perfettamente valida? Speriamo che questa non sia una di quelle domande RTFM super facili che verranno downvotate 30 volte.
UPDATE:
Sono andato avanti e ha aggiunto 10.000 righe di RecipeMetadata con valori casuali. Ho quindi fatto un ANALIZZA sul tavolo e un REINDEX solo per essere sicuro. Quando eseguo la query:
select recipeid from RecipeMetadata where diet_glutenfree;
ottengo:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'
Quindi, sembra stia facendo una scansione sequenziale sul tavolo anche se solo circa la metà le righe hanno questa bandiera. L'indice viene ignorato.
Se lo faccio:
select recipeid from RecipeMetadata where not diet_glutenfree;
ottengo:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'
Quindi, non importa cosa, questo indice non è in uso.
Si prega di aggiungere un link al tuo PostgreSQL mailing list posta dagli archivi così la gente può collegare questa discussione con quello. Sarebbe bello se pubblicassi un follow up sul tuo post sulla mailing list con un link anche a questo. Se devi eseguire il cross-post in più posizioni, ti preghiamo di dirlo per evitare che le persone ripetano il lavoro. –
Non è un problema, farò questo in futuro (Io di solito non posterò in entrambi i posti) .. –
BTW, penso che la risposta breve alla tua domanda è "sì" ... ma se siete preoccupati , riempire una tabella con alcuni dati fittizi, 'ANALIZZA' la tabella, quindi usare' ESPLORA ANALISI 'per esaminare i piani di alcune query che dovrebbero raggiungere l'indice parziale. –