Pular para o conteúdo

Os perigos dos Índices BITMAP

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.

Ricardo Portilho Proni

Ricardo Portilho Proni

Com 20 anos de experiência profissional, Oracle ACE Member – eleito pela Oracle Corporation um dos maiores especialistas do mundo em Oracle Database- Trabalhou em grande parte dos maiores bancos de dados Oracle do Brasil. Certificado em Oracle, SQL Server, DB2, MySQL, Sybase e Websphere. Conselheiro do GPO e do GUOB, palestrante do ENPO, GUOB Tech Day e Oracle Open World, escritor da Revista SQL Magazine e Instrutor na Nerv.

Comentário(s) da Comunidade

  1. 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..!!

  2. 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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress