Técnicas de índice de bitmap Oracle

Boa noite novamente!

Estamos lançando o segundo fluxo do nosso novo curso "Relational DBMS" , que concluímos um pouco de acordo com os resultados da primeira execução: classes adicionais nos clusters MySQL e Postgres acabaram sendo solicitadas pelo docker e várias outras "melhorias de arquivo". Portanto, espere lições abertas (nas quais alguns dos tópicos antigos foram retirados) e materiais interessantes. Hoje nos aprofundamos nas técnicas da Oracle.

Vamos lá

Os índices de bitmap Oracle são muito diferentes dos índices de árvore B padrão. Nas estruturas de bitmap, uma matriz bidimensional é criada com uma coluna para cada linha na tabela indexada. Cada coluna representa um valor separado no índice de bitmap. Essa matriz bidimensional mostra cada valor de índice vezes o número de linhas nesta tabela.

O Oracle descompacta o bitmap (com velocidade de recuperação da linha) no buffer de dados da RAM para uma verificação rápida de valores correspondentes. Esses valores correspondentes são transmitidos ao Oracle como uma lista de ID de linha e os valores de ID de linha podem acessar diretamente as informações necessárias.



Uma vantagem particular da indexação de bitmap se manifesta quando uma única tabela inclui vários índices de bitmap. O poder de cada coluna pode ser baixo. A criação de vários índices de bitmap fornece uma abordagem muito poderosa para responder rapidamente a consultas SQL complexas.



Usando a metodologia de pool de bitmap, o Oracle fornece uma redução no tempo de resposta de menos de um segundo ao trabalhar com várias colunas com um pequeno número de elementos.

Também preste atenção às notas importantes sobre os valores máximos do índice de bitmap Oracle .

Por exemplo, imagine que exista um banco de dados de carros com um grande número de colunas de baixa potência: car_color, car_make, car_model e car_year. Cada coluna contém menos de 100 valores diferentes e o índice da árvore b seria completamente inútil em um banco de dados de 20 milhões de carros.

No entanto, mesclar esses índices em uma consulta pode fornecer um tempo de resposta alto muito mais rápido que o método tradicional de leitura de cada uma das 20 milhões de linhas na tabela base. Por exemplo, suponha que queremos encontrar o velho Toyota Corolla azul fabricado em 1981:

select license_plat_nbr from vehicle where color = "blue" and make = "toyota" and year = 1981; 

Para trabalhar com essa consulta, a Oracle usa um método de otimização especializado chamado combinação de índices de bitmap. Nesse método, cada lista de ID de linha (brevemente RID) é formada separadamente usando bitmaps, e um procedimento de mesclagem especial é usado para comparar listas RID e procurar valores sobrepostos.

À medida que o número de valores diferentes aumenta, o tamanho do bitmap aumenta exponencialmente. Portanto, um índice de 100 valores pode ser executado 1.000 vezes mais rápido que o índice de bitmap de 1.000 valores de colunas diferentes.

Vale lembrar que os índices de bitmap são adequados apenas para tabelas estáticas e visualizações materializadas que são atualizadas à noite e reconstruídas após o carregamento em lote de linhas. Se vários DML por segundo ocorrerem na sua tabela, tenha cuidado ao implementar índices de bitmap!

  • 1 a 7 valores-chave diferentes - as consultas com índices de bitmap de baixa potência são muito rápidas;
  • 8 - 100 valores-chave diferentes - Com um aumento no número de valores diferentes, a produtividade diminui proporcionalmente;
  • 100 - 10.000 valores diferentes - com mais de 100 valores diferentes, os índices de bitmap se tornam enormes e o desempenho do SQL cai rapidamente;
  • Mais de 10.000 valores-chave diferentes - nesse estágio, o desempenho é dez vezes menor do que em um índice com 100 valores diferentes.

Os índices de bitmap Oracle são um recurso muito poderoso do Oracle, mas existem armadilhas!

Você deseja usar o índice de bitmap nos seguintes casos:

  1. A coluna da tabela é leve - para o manual do DRAFT, considere um bitmap para qualquer índice com menos de 100 valores diferentes:

     select region, count(*) from sales group by region; 
  2. BAIXAS tabelas DML - o uso de inserção / atualização / exclusão deve ser baixo. A atualização de índices de bitmap requer muitos recursos, portanto, eles são mais adequados para tabelas somente leitura e tabelas atualizadas em lote todas as noites;
  3. Várias colunas - suas consultas SQL se referem a vários campos com baixa cardinalidade na instrução Where. A presença de índices de bitmap facilitará o trabalho do otimizador Oracle, que faz uma estimativa com base no custo (em resumo - CBO (Cost-Based Optimizer)).

Solucionar problemas de índices de bitmap Oracle

Os problemas mais comuns de implementação do índice de bitmap incluem o seguinte:

  • Mesa pequena - o CBO pode exigir uma verificação completa da tabela se ela for muito pequena!
  • Estatísticas ruins - analise o bitmap com dbms_stats logo após a criação:

 CREATE BITMAP INDEX emp_bitmap_idx ON index_demo (gender); exec dbms_stats.gather_index_stats(OWNNAME=>'SCOTT', INDNAME=>'EMP_BITMAP_IDX'); 

  • Teste da dica de ferramenta - Para usar seu novo índice de bitmap, use a dica de ferramenta Oracle INDEX:

 select /*+ index(emp emp_bitmap_idx) */ count(*) from emp, dept where emp.deptno = dept.deptno; 

Estamos aguardando perguntas e comentários aqui ou chegamos à nossa nova lição aberta .

Source: https://habr.com/ru/post/pt433090/


All Articles