Os perigos dos Índices BITMAP
O índice BITMAP, ao contrário do B-TREE, contém uma entrada para cada valor indexado, que aponta (por um bitmap) para todos os registros que contém este valor.
Por causa desta arquitetura, durante um INSERT de um registro, seu BITMAP estará bloqueado durante esta operação. Ninguém poderá inserir um valor igual na coluna indexada.
Veja o teste abaixo:
Microsoft Windows XP [versão 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\RPRONI>sqlplus
SQL*Plus: Release 11.1.0.7.0 - Production on Seg Jan 4 16:25:37 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Informe o nome do usußrio: SCOTT/TIGER
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> CREATE TABLE T1 (C1 VARCHAR2(10)) TABLESPACE USERS;
Tabela criada.
SQL> CREATE BITMAP INDEX TI_IDX ON T1(C1) TABLESPACE USERS;
-ndice criado.
SQL> INSERT INTO T1 VALUES ('Teste');
1 linha criada.
SQL>
Deixe esta sessão como está, e em seguida, abra outra sessão, e tente executar o mesmo INSERT:
Microsoft Windows XP [versão 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\RPRONI>sqlplus SCOTT/TIGER
SQL*Plus: Release 11.1.0.7.0 - Production on Seg Jan 4 16:27:00 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> INSERT INTO T1 VALUES ('Teste');
Este segundo INSERT irá esperar indefinidamente, até um COMMIT ou ROLLBACK da primeira sessão.
Parabéns, você fez o Oracle tornar-se monousuário para INSERTs.
Salve Mestre Portilho..!!
Pior é quando Desenvolvedor vem brigar falando para criar indice BITMAP ao invés de B*Tree em uma tabela com mais de 20 milhoes de linhas, pois o select retorna muito mais rápido… ai vc vai “conversar” com ele, explicando que indice BITMAP só e util em tabelas q não sofrem alteração, ai ele fala “Mas eu LI em um artigo q o indice BITMAP é 40% mais performatico que indice B*Tree”…
Tem horas q dá vontade de criar o indice só para o desenvolvedor ver oq é bom.. Mas o problema é que sobra para o DBA..!!!
Obs.: Senti uma pontinha de “IRA” neste seu post.. heheh!!
Otima demonstração Portilho..!!
Nada melhor mostrar do que apenas dizer..!!
Ahh.. Otimo 2010 para ti..!!!
Abraços..!!
Grande Portilho,
Realmente, os Bitmap Indexes devem ser utilizados com muitíssima cautela devido a lentidão em comandos DML. Eu mesmo que trabalho com ambientes de Data Warehouse, ainda não percebi muitas ocasiões onde os bitmap Indexes são mais interessantes que outros recursos como Particionamento, chaves concatenadas em um único campo… Bitmap Join índex talvez seja mais utilizado. Vejamos, um bitmap index é aconselhável em colunas de baixa cardinalidade (Sexo, Status..). A partir daí, seria mais interessante em muitos casos se criar uma partição (ou sub-partição) em lista na própria tabela, uma para cada conjunto de valor, evitando assim que o os blocos do index e da tabela sejam lidos desnecessariamente economizando recursos de I/O, CPU e tempo…
Portilho, por favor comente!
Aguardo a próximo artigo!
Ah, e esqueci de dizer, ótimo 2010 para você tb Regis !