Pessoal,
Bom dia!
O índice bitmap é um tipo de índice que pode ser utilizado para otimizar consultas que utilizam como filtro colunas que possuem baixa seletividade, ou seja, colunas que possuem pouca variação de valores. Ao criar um índice bitmap em uma coluna, o Oracle monta um mapa de bits para todas as linhas da tabela. Para cada linha há uma mapa de todos os valores possíveis da coluna indexada. O Oracle grava um bit 1 onde o valor existe em uma determinada linha e 0 para os valores que não existem nesta linha.
Abaixo exemplo da estrutura do índice Bitmap na coluna "sexo" de uma tabela que possui 19 linhas:
Vamos comparar o desempenho entre três consultas SQL. Uma sem índice, outra utilizando o índice Btree que é o índice normalmente utilizado e mais conhecido e por fim o índice Bitmap que é o nosso propósito.
Primeiramente vamos criar uma tabela cópia da ALL_OBJECTS do Oracle por nome de TB_01. Nosso foco será na coluna OWNER onde o mesmo dono aparece várias vezes, pois, temos vários objetos criados no banco para o mesmo proprietário.
1 - Abaixo criamos nossa tabela TB_01, e multiplicamos algumas vezes os registros dela:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 SQL> create table tb_01 as select * from all_objects; Table created SQL> insert into tb_01 select * from tb_01; 239020 rows inserted SQL> insert into tb_01 select * from tb_01; 478040 rows inserted SQL> insert into tb_01 select * from tb_01; 956080 rows inserted SQL> commit; Commit complete
2 - Vamos agora comparar algumas consultas SQL.
Realizamos uma contagem na tabela que acabamos de criar, sem índice algum criado. 0.75 milésimos de segundos foi o tempo total gasto da consulta.
SQL> select count(distinct owner) from tb_01; -- sem index COUNT(DISTINCTOWNER) -------------------- 475 Executed in 0,75 seconds
3 - Vamos comparar o tempo da consulta anterior, agora utilizando o índice Btree. Criamos o índice Btree na coluna OWNER e realizamos a mesma contagem nesta coluna. Vemos que o tempo se manteve o mesmo, assim, o índice Btree nesta situação foi desnecessário!
SQL> create index idx_btree_objts on tb_01 (owner); Index created Executed in 13,547 seconds SQL> select count(distinct owner) from tb_01; -- com index btree COUNT(DISTINCTOWNER) -------------------- 475 Executed in 0,75 seconds SQL> drop index idx_btree_objts; Index dropped
4 - Por fim, criamos o índice do tipo Bitmap na coluna OWNER e realizamos a mesma contagem através da coluna indexada. O tempo total agora caiu para 0.60 milésimos de segundos. Foi aproximadamente 25% mais rápido!
SQL> create bitmap index idx_bmap_objts on tb_01 (owner); Index created Executed in 0,75 seconds SQL> select count(distinct owner) from tb_01; -- com index bitmap COUNT(DISTINCTOWNER) -------------------- 475 Executed in 0,60 seconds
5 - Explicação: Sobre o total de registros da tabela que é de quase 2 milhões, existe uma baixa seletividade sobre a coluna OWNER, há cerca de 68% dos registros da tabela em que o owner se repete! Neste caso o índice Bitmap é mais vantajoso. Abaixo quantidade de registros da tabela e uma amostra da tabela criada em que temos a maior parte dos registros com baixa seletividade:
SQL> select count(*) from tb_01; COUNT(*) ---------- 1912160 SQL> select owner, count(*) from tb_01 group by owner order by 2 desc; OWNER COUNT(*) ------------------------------ ---------- PUBLIC 350840 RM 327208 SYS 301160 RM3 206552 PRODUCAO 117912 ...
Em resumo:
+ Crie Índice Bitmap quando for necessário efetuar consultas em colunas que possuem: baixa seletividade e alta cardinalidade (quantidade de registros), como exemplo de coluna: Sexo do cliente em que há apenas duas variações: Feminino, Masculino; outras colunas que são candidatas em receber este tipo de índice são: Estado Cívil, UF, Tipo de Pessoa(Física/Jurídica) etc.
+ Cuidado ao criar índice em colunas de tabelas que sofrem muitas atualizações frequentes, pois, degradam demasiadamente a performance das atualizações!
Ronaldo
Nenhum comentário:
Postar um comentário