Determinado analista de sistema da Câmara Municipal está oti...

Próximas questões
Com base no mesmo assunto
Q3408217 Banco de Dados
Determinado analista de sistema da Câmara Municipal está otimizando uma consulta SQL para gerar um relatório de solicitações processadas por departamento. A tabela Solicitações possui os seguintes campos:

• id_solicitacao (chave primária)
• id_departamento (chave estrangeira)
• data_solicitacao
• status ('pendente', 'em andamento', 'concluída')
A consulta a seguir foi implementada para contar o número de solicitações concluídas por departamento:
SELECT id_departamento, COUNT(*) AS total_concluidas FROM Solicitações WHERE status = 'concluída' GROUP BY id_departamento;

A equipe identificou que a consulta está impactando o desempenho do banco de dados quando acessada simultaneamente por múltiplos usuários. Considerando o impacto causado por acessos concorrentes a uma consulta de leitura com agregação, qual das estratégias a seguir representa a solução mais eficaz para otimizar o desempenho e reduzir a carga sobre o banco de dados?
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: B – Substituir a consulta por uma visão materializada, armazenando os resultados pré-calculados para reduzir a carga computacional da consulta.

1. Tema Central e Relevância

A questão aborda otimização de desempenho em bancos de dados, focando no uso de visões materializadas para reduzir o impacto de consultas complexas em cenários de acesso concorrente. Esse tema é recorrente em provas de concursos e fundamental para quem busca trabalhar com administração de bancos de dados em órgãos públicos.

2. Resumo Teórico

Uma visão (view) tradicional é uma consulta salva que gera os dados dinamicamente a cada acesso. Já a visão materializada (materialized view) armazena fisicamente os resultados da consulta no banco, permitindo leituras rápidas, pois não recalcula os dados toda vez. Segundo o Manual do Oracle (Oracle® Database Concepts) e a documentação oficial do PostgreSQL, visões materializadas são indicadas para relatórios e agregações acessados frequentemente, pois diminuem a carga de processamento.

Justificativa da Alternativa Correta (B)

Ao substituir a consulta por uma visão materializada, os resultados já ficam pré-calculados e armazenados. Assim, múltiplos usuários podem consultar esses dados rapidamente, sem sobrecarregar o banco com os mesmos cálculos repetidos. Essa abordagem é consagrada e recomendada para relatórios gerenciais acessados por muitos usuários.

3. Análise das Alternativas Incorretas

AIndexação no campo status até ajuda na filtragem, mas não resolve o gargalo da agregação e da alta concorrência, pois o COUNT(*) GROUP BY continuará exigindo processamento.

CNível de isolamento SERIALIZABLE aumenta a segurança dos dados, mas reduz a concorrência e pode causar lentidão ainda maior, pois bloqueia leituras simultâneas.

DBloqueio exclusivo na tabela impede qualquer leitura enquanto a consulta ocorre, prejudicando gravemente o desempenho e a experiência dos usuários, sem ganho de performance.

4. Estratégias de Interpretação

Fique atento a palavras-chave como "otimizar desempenho", "acessos concorrentes" e "reduzir carga". Soluções que envolvem bloqueios ou isolamento extremo, normalmente, aumentam o problema em vez de resolvê-lo. Priorize alternativas que tragam armazenamento prévio de resultados ou redução de cálculos repetidos em consultas de leitura intensiva.

Gostou do comentário? Deixe sua avaliação aqui embaixo!

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Pessoal, indexação deveria resolver. Já usei esta solução em uma empresa que trabalhei. Alguém pode detalhar o motivo da view materializada ser a melhor ?

### Análise da Situação:

A consulta atual agrupa solicitações concluídas por departamento, gerando alto custo computacional devido:

- **Agregação (`COUNT(*) + GROUP BY`)** em tabela potencialmente grande

- **Acessos concorrentes** multiplicando a carga

- Filtro `WHERE status = 'concluída'` que pode não ser seletivo o suficiente.

---

### Avaliação das Alternativas:

#### **A. Indexação no campo `status`**  

- **Problema**: Índices em colunas de baixa seletividade (como status com poucos valores distintos) têm eficiência limitada.  

- **Impacto**: Não resolve o custo da agregação, apenas a filtragem inicial.  

- **Resultado**: **Ineficaz** para o cenário.

#### **B. Visão Materializada** ✅  

- **Solução**: Armazena **resultados pré-calculados** (agregação já processada).  

- **Vantagens**:  

 - Consultas subsequentes acessam dados pré-agregados (sem `GROUP BY` em tempo real).  

 - Atualização periódica via `REFRESH MATERIALIZED VIEW` (ex.: horário de baixo tráfego).  

 - Elimina bloqueios e conflitos de concorrência.  

- **Resultado**: **Melhor solução** para relatórios não exigentes em tempo real.

#### **C. Isolamento `SERIALIZABLE`**  

- **Problema**: Bloqueia transações concorrentes, causando **filas de espera**.  

- **Impacto**: Piora o desempenho em acessos simultâneos (exatamente o cenário crítico).  

- **Resultado**: **Aumenta** o problema de concorrência.

#### **D. Bloqueio Exclusivo (`LOCK`)**  

- **Problema**: Trava toda a tabela durante a consulta, **paralizando o sistema**.  

- **Impacto**: Inviável em produção (bloqueia até operações simples).  

- **Resultado**: **Catastrófico** para disponibilidade.

---

### Conclusão:

**Alternativa B (Visão Materializada)** é a solução mais eficaz porque:  

1. **Remove a carga computacional** da agregação em tempo real.  

2. **Permite concorrência sem bloqueios**: Usuários acessam um snapshot pré-calculado.  

3. **Atualização controlada**: `REFRESH` pode ser feito em janelas de manutenção.  

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo