Questão de Banco de Dados — Oracle — FGV 2024
- Código
- fg165205
- Banca
- FGV
- Órgão
- TJ AP
- Ano
- 2024
- Cargo
- AJ ( )
- Abitmap;
- Bhashing;
- Cespacial;
- Dárvore B;
- Esequencial.
GabaritoD — árvore B;
Gabarito: letra D — o comando CREATE INDEX idx_movimento_processoID ON movimento(processoID); cria, por padrão, um índice do tipo árvore B (B-tree). No Oracle, quando não se especifica o tipo de índice, o padrão é o B-tree, que é a estrutura mais adequada para consultas com operações de junção e intervalo, como o BETWEEN apresentado no enunciado.
O índice é uma estrutura de acesso auxiliar associada a uma tabela, utilizada para agilizar a recuperação de registros em resposta a certas condições de pesquisa. Sem o uso de índices, a busca das informações ocorre de forma sequencial e pode levar muito tempo caso haja uma grande quantidade de linhas a serem percorridas. No Oracle, o tipo de índice padrão, criado quando não se especifica o tipo, é o B-tree, uma estrutura de árvore balanceada que armazena dados classificados e permite pesquisas, acesso sequencial, inserções e remoções de forma eficiente.
A árvore B é uma estrutura de dados em árvore, auto balanceada, que armazena dados classificados e permite pesquisas, acesso sequencial, inserções e remoções no banco de dados. Ela é dita balanceada quando toda página folha tem o mesmo número de páginas intermediárias até a raiz. Essa estrutura é ideal para consultas que envolvem operações de junção (JOIN) e intervalo (BETWEEN), pois os dados são organizados de forma ordenada, permitindo que o otimizador realize um Index Range Scan para recuperar rapidamente os registros dentro de uma faixa de valores.
A consulta do enunciado filtra por parte.processoID BETWEEN 10 AND 20, ou seja, uma busca por intervalo. O índice B-tree é perfeitamente adequado para esse cenário, pois mantém os valores das chaves ordenados, permitindo localizar o início e o fim do intervalo de forma eficiente. Já um índice hash, por exemplo, é ótimo para buscas por igualdade, mas ineficiente para intervalos, pois a função de espalhamento destrói a ordem dos valores.
A pegadinha da questão está em reconhecer que o comando CREATE INDEX sem a cláusula BITMAP cria um índice B-tree. Muitos candidatos podem confundir com o índice bitmap, que é criado com CREATE BITMAP INDEX e é eficiente para colunas com baixa cardinalidade (poucos valores distintos), como 'Gênero' ou 'Estado Civil'. No entanto, para a consulta apresentada, com operação de junção e intervalo, o B-tree é a escolha correta.
Guarde a distinção entre os tipos de índice: o B-tree é o padrão e o mais usado, ideal para consultas por igualdade e intervalo; o bitmap é eficiente para colunas com muitos valores repetidos e é o padrão em bancos multidimensionais; o hash é ótimo para igualdade, mas inútil para faixa; o espacial é usado para dados geográficos; e o sequencial não é um tipo de índice, mas sim uma forma de varredura. É exatamente essa fronteira que separa as alternativas.
Critério | B-tree (padrão) | Bitmap | Hash | Espacial |
|---|---|---|---|---|
Comando de criação |
|
| Não criado via |
|
Ideal para | Igualdade e intervalos ( | Colunas de baixa cardinalidade (poucos valores distintos) | Igualdade ( | Dados geográficos/espaciais |
Desempenho em intervalo | Excelente (Index Range Scan) | Ruim (não preserva ordem) | Ineficiente (função hash destrói ordem) | Não aplicável |
Aplicação no caso | ✅ | ❌ Alta cardinalidade de | ❌ Consulta por intervalo | ❌ Coluna numérica, não espacial |
O índice bitmap é criado com o comando CREATE BITMAP INDEX, e não com CREATE INDEX simples. Ele é eficiente para colunas com baixa cardinalidade (poucos valores distintos), como 'Gênero' ou 'Estado Civil'. No caso da coluna processoID, que provavelmente tem alta cardinalidade (muitos valores distintos), um índice bitmap seria ineficiente, ocupando muito espaço e prejudicando a performance. Além disso, o comando do enunciado não especifica BITMAP, então o índice criado não é desse tipo.
O índice hashing (ou hash) é uma estrutura que usa uma função de espalhamento para mapear chaves a posições. Ele é ótimo para buscas por igualdade (=), mas ineficiente para consultas por intervalo (BETWEEN), pois a função hash não preserva a ordem dos valores. No Oracle, o índice hash não é criado com o comando CREATE INDEX padrão; ele é usado em contextos específicos, como em tabelas organizadas por hash (hash cluster). Portanto, não é o tipo de índice criado pelo comando do enunciado.
O índice espacial é usado para dados geográficos e espaciais, como coordenadas, pontos, linhas e polígonos. Ele é criado com a cláusula INDEXTYPE IS MDSYS.SPATIAL_INDEX e é específico para consultas espaciais, como 'encontrar todos os pontos dentro de uma área'. A coluna processoID é um identificador numérico, não um dado espacial, então o índice espacial não se aplica a esse caso.
O comando CREATE INDEX idx_movimento_processoID ON movimento(processoID); cria, por padrão, um índice do tipo árvore B (B-tree). No Oracle, quando não se especifica o tipo de índice, o padrão é o B-tree. Essa estrutura é uma árvore balanceada que armazena os valores das chaves de forma ordenada, permitindo buscas eficientes por igualdade e por intervalo. Para a consulta com JOIN e BETWEEN, o B-tree é a estrutura ideal, pois permite que o otimizador realize um Index Range Scan para recuperar rapidamente os registros dentro da faixa de valores.
O índice sequencial não é um tipo de índice em banco de dados. A varredura sequencial (full table scan) é uma forma de acesso aos dados que percorre todas as linhas da tabela, sem usar um índice. O comando CREATE INDEX cria uma estrutura de índice, não uma varredura sequencial. Portanto, essa alternativa não corresponde ao tipo de índice criado.
Gabarito: letra D
Link permanente: /questoes/fg165205