Taster på VARCHAR
kolonner kan være meget lange, hvilket resulterer i færre poster pr. side og mere dybde (flere niveauer i B-Tree
). Længere indekser øger også cache-miss-forholdet.
Hvor mange strenge i gennemsnit knytter sig til hvert heltal?
Hvis der er relativt få, kan du kun oprette et indeks på heltalskolonnen og PostgreSQL
vil foretage den fine filtrering på poster:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Du kan også overveje at oprette indekset på streng-hasherne:
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?
Hver hash er kun 16
bytes lange, så indekstasterne vil være meget kortere, mens de stadig bevarer selektiviteten næsten perfekt.