PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Indexation SQL sur varchar

Clés sur VARCHAR les colonnes peuvent être très longues, ce qui entraîne moins d'enregistrements par page et plus de profondeur (plus de niveaux dans le B-Tree ). Des index plus longs augmentent également le taux d'échec du cache.

Combien de chaînes correspondent en moyenne à chaque entier ?

S'il y en a relativement peu, vous pouvez créer un index uniquement sur la colonne entière et PostgreSQL effectuera le filtrage fin sur les enregistrements :

CREATE INDEX ix_mytable_assoc ON mytable (assoc);

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

Vous pouvez également envisager de créer l'index sur les hachages de chaîne :

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?

Chaque hachage est seulement 16 octets de long, donc les clés d'index seront beaucoup plus courtes tout en préservant presque parfaitement la sélectivité.