Como o Oracle armazena os dados?
A estrutura de armazenamento do Oracle Database é projetada para ser altamente eficiente e flexível, permitindo o armazenamento e o gerenciamento de grandes volumes de dados de forma organizada e segura.
Visão Geral da Estrutura de Armazenamento
O Oracle organiza os dados em várias camadas hierárquicas, garantindo escalabilidade e otimização. As principais estruturas de armazenamento do Oracle são:
- Database (Banco de dados)
- Tablespace
- Segment
- Extent
- Oracle Data Block
Cada um desses níveis desempenha um papel importante na organização e armazenamento dos dados.
Database
No nível mais alto da hierarquia, temos o Database. O banco de dados Oracle é composto por vários arquivos de dados que armazenam as informações do usuário e os metadados necessários para o funcionamento do sistema. Ele é o contêiner principal que engloba todos os outros componentes de armazenamento.
O Oracle Database é composto por três tipos principais de arquivos:
- Datafiles: Armazenam os dados reais.
- Redo Log Files: Guardam um histórico das alterações no banco, usados para recuperação em caso de falhas.
- Control Files: Contêm informações estruturais sobre o banco, como a localização dos datafiles e redo logs.

Tablespace
O Tablespace é o próximo nível da hierarquia e age como um contêiner lógico para organizar os dados dentro do banco de dados. Ele agrupa múltiplos datafiles, que são arquivos físicos no sistema operacional onde os dados reais são armazenados. Um banco de dados pode ter vários tablespaces, sendo cada um especializado em armazenar diferentes tipos de objetos de dados.
Os tablespaces podem ser divididos em dois tipos principais:
- Permanent Tablespaces: Armazenam dados persistentes, como tabelas e índices.
- Temporary Tablespaces: Usados para operações temporárias, como ordenações ou junções de dados durante consultas.
Exemplos comuns de tablespaces incluem:
- SYSTEM: Onde ficam os dicionários de dados (metadados do banco).
- SYSAUX: Um tablespace auxiliar para armazenar componentes não-críticos, como o AWR.
- USERS: Um tablespace típico onde são armazenados os dados dos usuários.

Segment
Dentro de cada tablespace, encontramos os segments. Um segmento é um espaço lógico alocado para armazenar um tipo específico de objeto de banco de dados, como uma tabela, índice, view materializada, rollback segment, etc.
Cada tipo de segmento desempenha um papel específico:
- Data Segments: Armazenam os dados reais das tabelas.
- Index Segments: Contêm os índices de tabelas para melhorar a performance de busca.
- Temporary Segments: Usados para operações temporárias, como ao realizar consultas grandes.
- Undo Segments: Utilizados para manter o controle das transações para garantir a consistência dos dados e permitir rollback.
Os segmentos são compostos por unidades de espaço chamadas extents.
Extent
Um extent é uma unidade contígua de espaço dentro de um segmento, onde os dados são armazenados fisicamente nos datafiles. Um segmento é composto por um ou mais extents, que são alocados conforme necessário para acomodar o crescimento do objeto de banco de dados (como uma tabela que aumenta de tamanho).
Quando um segmento precisa de mais espaço, o Oracle aloca um novo extent para ele. Os extents garantem que os dados sejam armazenados em blocos contínuos, o que melhora a eficiência de leitura/escrita.

Oracle Data Block
O nível mais baixo da hierarquia de armazenamento é o Oracle Data Block, também chamado de database block ou data block. Os data blocks representam a menor unidade de armazenamento no Oracle Database. Cada extent é composto de múltiplos data blocks.
Os data blocks armazenam os dados reais, como as linhas de uma tabela. Eles são a interface entre o banco de dados e o sistema de arquivos subjacente. O tamanho dos data blocks é configurável e pode variar (tipicamente 4KB, 8KB, 16KB ou 32KB), dependendo das necessidades do ambiente.
Os data blocks contêm várias informações, além dos dados do usuário, como cabeçalhos que registram metadados importantes, como o endereço do bloco e informações de transações.
Componentes de um Oracle Data Block
Um data block possui várias subestruturas:
- Cabeçalho do Bloco (Block Header): Contém metadados sobre o bloco, como o endereço do bloco, identificadores de transações ativas e status de formatação.
- Tabela de Diretório (Table Directory): Mantém informações sobre as tabelas cujos dados estão armazenados neste bloco (importante em caso de blocos com dados de mais de uma tabela).
- Tabela de Linhas (Row Directory): Lista de ponteiros para as linhas reais armazenadas no bloco.
- Linhas de Dados: São os dados reais das colunas de uma tabela.
- Espaço Livre (Free Space): Espaço não utilizado no bloco que pode ser usado para inserções futuras ou expansões de linhas.
- Gerenciamento de Espaço: O Oracle utiliza métodos sofisticados para o gerenciamento de espaço dentro dos blocos, como o PCTFREE (percentual de espaço reservado para futuras atualizações) e PCTUSED (percentual de ocupação após o qual novos dados podem ser inseridos no bloco).

Tabelas e Índices no Oracle Data Block
Os data blocks podem armazenar dados de tabelas e índices. Ao trabalhar com tabelas:
- As linhas da tabela são armazenadas dentro dos data blocks.
- Em caso de atualização, se a linha de dados crescer e não couber no bloco original, pode ocorrer a migração de linhas ou encadeamento de linhas, em que a linha é movida para outro bloco, o que pode afetar a performance.
No caso de índices, os data blocks são usados para armazenar as estruturas de árvore B-tree que organizam e aceleram a busca de dados.


No Oracle Database, a parametrização de armazenamento em uma tabela, definida pela cláusula STORAGE, determina como o espaço em disco será alocado e gerenciado para essa tabela. Esses parâmetros são essenciais para otimizar o uso de espaço, controlar o crescimento dos segmentos e reduzir a fragmentação. Eles influenciam aspectos como o tamanho dos extents, a reserva de espaço para atualizações futuras e a frequência de alocação de novos extents. Vamos explorar esses parâmetros com base na tabela de exemplo “empregados”:
CREATE TABLE empregados (
empregado_id NUMBER PRIMARY KEY,
nome VARCHAR2(100),
cargo VARCHAR2(50),
salario NUMBER(10, 2),
data_admissao DATE DEFAULT SYSDATE,
departamento_id NUMBER,
CONSTRAINT fk_departamento
FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id)
) TABLESPACE meu_tablespace
STORAGE (
INITIAL 64K
NEXT 128K
PCTINCREASE 0
)
PCTFREE 10
PCTUSED 40;
Parâmetros de Armazenamento (STORAGE Clause)
1. INITIAL
- Descrição: Define o tamanho do primeiro extent alocado para o segmento da tabela. Um extent é uma unidade contígua de espaço no disco alocada para armazenar dados.
- Exemplo: "INITIAL 64K" significa que o primeiro extent terá 64 kilobytes. Isso determina o espaço inicial reservado para a tabela ao ser criada, influenciando a capacidade inicial de armazenamento.
2. NEXT
- Descrição: Especifica o tamanho dos extents subsequentes alocados após o primeiro. À medida que a tabela cresce e o primeiro extent é preenchido, um novo extent é alocado com o tamanho definido aqui.
- Exemplo: "NEXT 128K" indica que cada novo extent alocado após o primeiro terá 128 kilobytes. Esse valor ajuda a controlar o crescimento da tabela ao longo do tempo, garantindo alocações eficientes de espaço.
3. PCTINCREASE
- Descrição: Define a porcentagem de aumento de cada novo extent em relação ao anterior. Isso controla o crescimento progressivo dos extents.
- Exemplo: "PCTINCREASE 0" indica que todos os extents subsequentes terão o mesmo tamanho definido em "NEXT", ou seja, 128K. Se fosse configurado um valor diferente de zero, cada novo extent seria maior que o anterior, aumentando pela porcentagem especificada. Por exemplo, se "PCTINCREASE" fosse 50, o próximo extent após 128K seria 192K (50% maior).
Outros Parâmetros de Tabela
1. PCTFREE
- Descrição: Determina a porcentagem de espaço em cada data block que é reservada para futuras atualizações de linhas já existentes. Isso garante que, ao alterar valores de uma linha, o bloco tenha espaço suficiente para armazenar os novos dados sem precisar movê-los para um bloco diferente.
- Exemplo: "PCTFREE 10" reserva 10% de cada data block para atualizações futuras. Se uma linha for atualizada e seus novos dados excederem o espaço previamente alocado para ela, os 10% reservados serão usados para evitar a migração de linhas para outros blocos, o que poderia impactar a performance.
2. PCTUSED
- Descrição: Define a porcentagem mínima de ocupação de um data block antes que ele seja reutilizado para novas inserções de dados. Após a exclusão ou movimentação de linhas, se o percentual de uso do bloco cair abaixo desse limite, o bloco será reutilizado para novas inserções.
- Exemplo: "PCTUSED 40" indica que, quando a ocupação do bloco cair abaixo de 40%, ele será marcado como disponível para novas inserções de dados. Esse parâmetro ajuda a evitar fragmentação e melhora a eficiência na reutilização de blocos parcialmente cheios.
Como Esses Parâmetros Funcionam Juntos
- Alocação Inicial e Crescimento de Extents:
- Ao criar a tabela, o Oracle aloca um extent inicial de 64K, conforme definido em "INITIAL". À medida que os dados são inseridos e o extent inicial é preenchido, o Oracle aloca novos extents de 128K, conforme especificado em "NEXT". Como "PCTINCREASE" está definido como 0, todos os extents subsequentes terão o mesmo tamanho de 128K. Isso mantém o crescimento linear e previsível da tabela.
- Gerenciamento de Espaço Livre em Data Blocks:
- O parâmetro "PCTFREE 10" garante que 10% de cada data block seja reservado para atualizações de dados. Isso é importante para evitar que atualizações frequentes de linhas movam os dados para novos blocos, o que reduziria a eficiência de leitura. Esse espaço reservado permite que as linhas cresçam dentro do mesmo bloco.
- O parâmetro "PCTUSED 40" garante que blocos parcialmente utilizados sejam reutilizados para novas inserções quando sua ocupação cair abaixo de 40%. Isso ajuda a evitar o desperdício de espaço em blocos que não estão completamente cheios e reduz a necessidade de alocar novos blocos, otimizando o uso do espaço.
Benefícios da Configuração Correta dos Parâmetros de Armazenamento
Ao configurar corretamente os parâmetros de armazenamento, é possível otimizar o uso de espaço e melhorar a performance da tabela. Esses parâmetros permitem ao DBA:
- Controlar o crescimento do segmento: Ao especificar tamanhos adequados para os extents e definir políticas claras para a alocação subsequente, o crescimento da tabela é gerenciado de maneira eficiente, evitando fragmentação excessiva.
- Gerenciar atualizações e inserções: Parâmetros como "PCTFREE" e "PCTUSED" garantem que os blocos de dados sejam utilizados de forma inteligente, reservando espaço para atualizações e reutilizando blocos que ficaram abaixo da ocupação mínima.
- Prevenir fragmentação: O controle da alocação de extents e a reutilização de blocos parcialmente ocupados ajudam a minimizar a fragmentação, o que melhora a performance de leitura e escrita no banco de dados.
Esses parâmetros, quando bem configurados, são ferramentas poderosas para otimizar o armazenamento e o desempenho de tabelas no Oracle Database, garantindo uma utilização eficiente dos recursos de hardware e mantendo a performance à medida que a tabela cresce e é atualizada ao longo do tempo.