sql >> Databasteknik >  >> RDS >> PostgreSQL

SQL-indexering på varchar

Knappar på VARCHAR kolumner kan vara mycket långa vilket resulterar i färre poster per sida och mer djup (fler nivåer i B-Tree ). Längre index ökar också cachemissförhållandet.

Hur många strängar i genomsnitt mappar till varje heltal?

Om det är relativt få kan du skapa ett index endast på heltalskolumnen och PostgreSQL kommer att göra finfiltreringen på poster:

CREATE INDEX ix_mytable_assoc ON mytable (assoc);

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

Du kan också överväga att skapa indexet på stränghasharna:

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?

Varje hash är bara 16 byte långa, så indexnycklarna kommer att vara mycket kortare samtidigt som selektiviteten bevaras nästan perfekt.



  1. Oracle GROUP_CONCAT() ekvivalent

  2. TRIGGER eller MULTI Insert

  3. PHP-kodningsfel vid produktion av XML från databasen

  4. Oracle :YEAR sökord ogiltigt