Indices bitmap – Oracle
Bom Dia Caros Leitores,
Hoje vou vos falar sobre algo simples, mas que muitos podem ter dúvidas principalmente quando programam SQL ou simplesmente precisam de optimizar por várias razões algum código.
Os programadores aplicam normalmente indices ao código, sem perceberem à priori, que tipo de indice necessitam, nem o seu impacto na performance. Hoje falaremos de indices bitmap que se resumem a indices que se designam comprimidos e que se aplicam geralmente nas seguintes situações:
- Colunas com pouca cardinalidade, ou seja, o número único de valores é muito baixo. Imaginem uma tabela por grande que seja que tenha uma coluna com notas de alunos de 0 a 5.
- Tabelas com realmente muito poucos INSERT/UPDATE/DELETE . Uma tabela de dicionário com dados estáticos é o ideal.
Sem entrar em muito detalhe quando ao uso destes indices nas situações acima, podemos considerar este tipo de indices altamente comprimidos (devido à sua natureza em que geram 1 bit para cada valor de coluna). A compressão destes indices permite uma leitura muito mais rápida fazendo nos poupar I/O pois ocupam menos espaço e são mais pequenos mas tendem a usar muito CPU de forma a conseguir "descomprimir" para o acesso.
Há muita contradição por essa interweb a fora que é possível usar este tipo de índices em tabelas com colunas com cardinalidades muito altas, sendo mesmo mais eficientes que os indices b-tree (em árvore binária) mas a minha experiência não me garante isto principalmente se as tabelas foram sujeitas a algumas (nem é preciso muitas) operações DML.
Estes tipo de indices são infinitamente mais complexos de manter optimizados, e com uma performance decente ao longo do tempo, devido principalmente à sua natureza de compressão e disposição em bitmap. Uma alteração a uma coluna, como por exemplo, passar a coluna das notas de alunos de 5 valores para 10, ou a adição de outra coluna causa um overhead enorme comparado com os conhecidos b-tree indices.
Obrigado.