PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Indexação SQL em varchar


Chaves em VARCHAR as colunas podem ser muito longas o que resulta em menos registos por página e mais profundidade (mais níveis na B-Tree ). Índices mais longos também aumentam a taxa de falta de cache.

Quantas strings em média mapeiam para cada inteiro?

Se houver relativamente poucos, você pode criar um índice apenas na coluna inteira e no PostgreSQL fará a filtragem fina nos registros:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);

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

Você também pode considerar criar o índice nos hashes de string:
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 tem apenas 16 bytes de comprimento, então as chaves de índice serão muito mais curtas enquanto ainda preservam a seletividade quase perfeitamente.