sql >> Base de Datos >  >> RDS >> PostgreSQL

Indexación de SQL en varchar

Claves en VARCHAR las columnas pueden ser muy largas, lo que da como resultado menos registros por página y más profundidad (más niveles en el B-Tree ). Los índices más largos también aumentan la proporción de errores de caché.

¿Cuántas cadenas en promedio asignan a cada entero?

Si hay relativamente pocos, puede crear un índice solo en la columna de enteros y PostgreSQL hará el filtrado fino en los registros:

CREATE INDEX ix_mytable_assoc ON mytable (assoc);

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

También puede considerar crear el índice en los hashes de cadena:

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?

Cada hash es solo 16 bytes de longitud, por lo que las claves de índice serán mucho más cortas y conservarán la selectividad casi a la perfección.