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

Indicizzazione SQL su varchar

Tasti su VARCHAR le colonne possono essere molto lunghe, il che si traduce in meno record per pagina e maggiore profondità (più livelli nel B-Tree ). Indici più lunghi aumentano anche il tasso di perdita della cache.

Quante stringhe in media associano a ciascun numero intero?

Se ce ne sono relativamente pochi, puoi creare un indice solo su colonne intere e PostgreSQL eseguirà il filtraggio fine sui record:

CREATE INDEX ix_mytable_assoc ON mytable (assoc);

SELECT  floatval
FROM    mytable
WHERE   assoc = givenint
        AND phrase = givenstring

Puoi anche considerare la creazione dell'indice sugli hash della stringa:

CREATE INDEX ix_mytable_md5 ON mytable (DECODE(MD5(phrase), 'HEX'));

SELECT  floatval
FROM    mytable
WHERE   DECODE(MD5(phrase), 'HEX') = DECODE(MD5('givenstring'), 'HEX')
        AND phrase = givenstring -- who knows when do we get a collision?

Ogni hash è solo 16 byte lunghi, quindi le chiavi dell'indice saranno molto più brevi pur mantenendo la selettività quasi perfettamente.