Questão de Banco de Dados — Otimização (Tuning) em Banco de Dados — FGV 2024
- Código
- fg165192
- Banca
- FGV
- Órgão
- CM SP
- Ano
- 2024
- Cargo
- Cons Leg ( )
- Abaseado em função.
- Bchave reversa.
- Cparticionado.
- Dárvore B.
- Ebitmap.
GabaritoE — bitmap.
Gabarito: letra E. O índice bitmap é o tipo adequado para colunas com baixa cardinalidade (poucos valores distintos), típico de ambientes de data warehouse com baixa atividade de DML e consultas analíticas ad hoc, sendo especialmente eficiente para a função COUNT(). Essa é a definição clássica do índice bitmap, amplamente documentada na literatura de banco de dados.
O índice bitmap é uma estrutura de dados que representa cada valor distinto de uma coluna como um mapa de bits (bitmap), onde cada bit indica se a linha correspondente possui aquele valor. Essa representação é extremamente compacta e permite que operações como COUNT(), AND, OR e NOT sejam realizadas diretamente sobre os bitmaps, sem acessar a tabela. Por isso, é ideal para colunas com baixa cardinalidade (ex.: sexo, status, categoria), onde o número de valores distintos é pequeno em relação ao total de linhas.
A adequação ao ambiente de data warehouse se deve a duas características: (1) baixa atividade de DML — como os dados são carregados em lote (ETL) e raramente atualizados, o custo de manutenção do índice (que é alto em operações de INSERT/UPDATE/DELETE) é aceitável; (2) consultas ad hoc — os usuários fazem filtros imprevisíveis e combinações de colunas, e o bitmap permite responder rapidamente a essas consultas, especialmente com COUNT() e agregações.
Para entender a diferença, compare com o índice B-tree (árvore B), que é o padrão e mais usado em bancos transacionais (OLTP). A árvore B é eficiente para consultas por igualdade e por faixa de valores, mas não é eficiente para colunas com baixa cardinalidade, pois a seletividade é baixa e o índice acaba sendo pouco útil. Já o bitmap, ao contrário, é ineficiente em ambientes com muitas escritas, pois cada atualização exige a reconstrução dos bitmaps.
A pegadinha da banca está em associar o índice bitmap a colunas com baixa cardinalidade e a ambientes analíticos (data warehouse), enquanto o candidato pode confundir com o índice B-tree, que é o mais comum. A questão descreve exatamente o cenário típico do bitmap: "número relativamente baixo de valores", "baixa atividade de DML", "filtragens ad hoc" e "eficiência em COUNT()".
Guarde a fronteira: bitmap = baixa cardinalidade + ambiente analítico (DW) + poucas escritas; B-tree = alta cardinalidade + ambiente transacional (OLTP) + muitas escritas. É nessa distinção que as alternativas se separam.
Critério | Bitmap (E) | B-tree (D) | Baseado em função (A) | Chave reversa (B) | Particionado (C) |
|---|---|---|---|---|---|
Cardinalidade ideal | Baixa (poucos valores distintos) | Alta (muitos valores distintos) | Qualquer (depende da expressão) | Alta (chaves sequenciais) | Qualquer (depende da estratégia) |
Ambiente típico | Data warehouse (DW) | OLTP (transacional) | OLTP/DW (depende do uso) | OLTP (alta concorrência) | DW/OLTP (tabelas grandes) |
Atividade de DML | Baixa (poucas escritas) | Alta (muitas escritas) | Moderada | Alta (inserções sequenciais) | Moderada |
Eficiência em COUNT() | Alta (operações diretas nos bitmaps) | Baixa (acesso à tabela) | Baixa | Baixa | Baixa |
Consultas ad hoc | Excelente (combinações imprevisíveis) | Boa (igualdade/faixa) | Boa (quando usa a função) | Ruim | Boa (com poda de partições) |
O índice baseado em função (function-based index) é criado sobre o resultado de uma expressão ou função aplicada a uma coluna (ex.: UPPER(nome)). Ele é útil quando as consultas filtram por uma função, mas não tem relação com baixa cardinalidade nem com eficiência em COUNT(). A banca o coloca como distrator para confundir com a ideia de "função" aplicada à coluna, mas o cenário descrito aponta para o bitmap.
O índice de chave reversa (reverse key index) inverte a ordem dos bytes da chave para distribuir melhor as inserções em tabelas com chaves sequenciais, evitando contenção em ambientes de alta concorrência. Ele não é indicado para colunas de baixa cardinalidade nem para consultas analíticas com COUNT(). É um distrator que remete a técnicas de otimização para escrita, não para leitura analítica.
O índice particionado divide o índice em partições menores, geralmente alinhadas às partições da tabela, para facilitar a manutenção e melhorar o desempenho em tabelas muito grandes. Embora seja usado em data warehouses, não é definido pela baixa cardinalidade das colunas, e sim pela estratégia de particionamento. A questão descreve especificamente a característica de "número relativamente baixo de valores", que é a marca do bitmap.
O índice de árvore B (B-tree) é o tipo padrão e mais usado, eficiente para consultas por igualdade e por faixa em colunas de alta cardinalidade (ex.: chaves primárias). Em colunas com baixa cardinalidade, a árvore B perde eficiência, pois a seletividade é baixa e o índice acaba sendo pouco útil. Além disso, não é especialmente eficiente para COUNT() em colunas de baixa cardinalidade, ao contrário do bitmap. A banca coloca a árvore B como distrator por ser o tipo mais conhecido, mas o cenário descrito é o oposto do que ela atende bem.
O índice bitmap é exatamente o tipo descrito: adequado para colunas com baixa cardinalidade (poucos valores distintos), típico de data warehouses com baixa atividade de DML (poucas escritas) e consultas ad hoc (filtros imprevisíveis), sendo eficiente para COUNT() porque as operações de contagem podem ser realizadas diretamente sobre os bitmaps, sem acessar a tabela. Essa é a definição consagrada do índice bitmap, presente na literatura de banco de dados e em materiais de otimização de consultas.
Para identificar o índice bitmap em provas, procure pelas palavras-chave: baixa cardinalidade, poucos valores distintos, data warehouse, baixa atividade de DML, consultas ad hoc e eficiência em COUNT(). Se a questão mencionar esses elementos, a resposta quase sempre será bitmap. Já a árvore B aparece quando há alta cardinalidade, muitas escritas e consultas por faixa.
Gabarito: letra E
Link permanente: /questoes/fg165192