Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

OBJETOS ADMINISTRATIVOS – TABLESPACES
CONCEITOS
O ORACLE aloca espaço para todos os tipos de dados do banco de dados. Quando um objeto 
é alocado, também é assegurada área para armazenamento das informações. Outro momento 
de alocação de área é quando o objeto cresce, requerendo um aumento de sua área prevista.
Estas reservas de espaço são feitas em TABLESPACES, que corresponde a uma área lógica 
para armazenamento de informações do banco de dados, no entanto, sabemos que o banco de 
dados armazena suas informações em DATAFILES.
Resta-nos, então, conhecer como estes elementos se relacionam:
◊ DATABASE x DATAFILES – Um banco de dados Oracle consiste de um conjunto de 
arquivos de dados, chamados DATAFILES. O sistema operacional onde o banco de 
dados está instalado tem visibilidade destes arquivos, no entanto, sua organização 
interna é totalmente de responsabilidade do banco de dados.
◊ DATABASE x TABLESPACES – Um banco de dados Oracle consiste de um conjunto 
de TABLESPACES, isto é, áreas para armazenamento de dados. O TABLESPACE é 
uma estrutura lógica, interna ao banco de dados. Não é visível pelo sistema operacional.
◊ TABLESPACES x DATAFILES – Um TABLESPACE está diretamente relacionado a um 
DATAFILE, na medida em que quando criamos um TABLESPACE (lógico), criamos, 
simultaneamente, o DATAFILE (físico) que receberá a informação. Desta forma cada 
DATAFILE só está associado a um TABLESPACE, em outras palavras, em um 
DATAFILE todas as informações pertencem a um único TABLESPACE. No entanto, 
poderemos atribuir mais de um DATAFILE a um único TABLESPACE. Sendo assim, o 
relacionamento entre TABLESPACE e DATAFILE é do tipo 1(tablespace):N(datafiles).
Na figura ao lado encontramos, graficamente, 
o relacionamento entre os elementos.
Para o sistema operacional existem dois 
arquivos: ts_aluno1.ora e ts_aluno2.ora.
Internamente, no Oracle, existe apenas o 
TABLESPACE TS_ALUNO. Os objetos que 
viermos alocar dentro deste tablespace 
podem ser acomodados pelo Oracle em 
qualquer dos arquivos físicos associados ou, 
até mesmo em partes.
CARACTERÍSTICAS DOS TABLESPACES
◊ Cada TABLESPACE consiste de um ou mais arquivos do sistema operacional.
◊ Os TABLESPACES podem ser colocados online enquanto o banco de dados estiver em 
execução.
◊ Os TABLESPACES podem ser colocados offline (exceto system ou um tablespace que 
tenham um segmento de rollback ativo) enquanto o banco de dados estiver em 
execução.
◊ Os TABLESPACES podem alternar de situação passando de read-write para read-only e 
vice-versa.
◊ Os objetos criados em um tablespace nunca podem alocar espaço fora de seu 
TABLESPACE original.
VANTAGENS
◊ Controlar a alocação de espaço e associar cotas de espaço para os usuários.
◊ Controlar a disponibilidade de dados, colocando o tablespace específico online ou offline.
◊ Possibilidade de distribuição de área através de diversos discos para adicionar 
performance (I/O) e reduzir a contenção de I/O (em vez de usar um único disco).
◊ Possibilidade de operações de backup e recuperação parcial.
◊ Colocação de grandes quantidades de dados estáticos em meios de armazenamento 
read-only.
O TABLESPACE SYSTEM
Um banco de dados é composto de pelo menos as tablespace, o SYSTEM., SYSAUX Estas 
TABLESPACES São criadas, automaticamente, pelo ORACLE quando o banco de dados é 
criado. Elas estão sempre ONLINE quando o banco de dados está aberto.
Os demais tablespaces adicionados ao banco de dados tem a finalidade de facilitar a 
manutenção e o controle das informações.
PARTICULARIDADES
◊ É OBRIGATÓRIO em todos os bancos de dados.
◊ É utilizado para operações internas do sistema.
◊ Contém as tabelas do DICIONÁRIO DE DADOS,e do Enterprise Manager por isso nunca 
pode estar offline.
◊ Contém o segmento de rollback SYSTEM.
◊ Pode conter dados do usuário.
◊ Armazena também as unidades de programa do sistema, isto é, as procedures, 
functions, packages e triggers. Estas unidades de programa residem no DICIONÁRIO 
DE DADOS, por este motivo, estão no tablespace SYSTEM.
Um banco de dados poderia existir sem que nenhum outro tablespace além do SYSTEM e 
SYSAUX fossem adicionadas a elas. 
A criação de tablespaces adicionais, no entanto, nos traz uma série de vantagens. Com o uso 
de múltiplos TABLESPACES podemos:
◊ Associar quotas de espaço para usuários.
◊ Controlar alocação de espaço no banco de dados.
◊ Controlar a disponibilidade dos dados, uma vez que podemos colocar tablespaces 
individuais online ou offline.
◊ Executar operações de Backup e Recovery parciais.
◊ Distribuir os dados em diversos periféricos visando performance.
A Oracle recomenda que criemos pelo menos um tablespace adicional (independentemente do 
tamanho do banco de dados) para armazenamento dos dados do usuário em local diferente dos 
dados do DICIONÁRIO DE DADOS.
Resumindo, poderíamos dizer que a utilização de mais de um tablespace além de dar mais 
flexibilidade para administração, também reduz a contenção relativa ao uso de objetos do 
DICIONÁRIO DE DADOS.
ALOCAÇÃO DE ESPAÇO PARA O BANCO DE DADOS
A quantidade total de espaço físico alocado pelos objetos do banco de dados Oracle, depende 
do tamanho dos arquivos (do sistema operacional) criados e associados a tablespaces 
individuais.
Se desejarmos aumentar a área de dados de um banco de dados, podemos agir de três formas:
◊Adicionar um novo DATAFILE a um TABLESPACE já existente. Esta operação adiciona ao 
TABLESPACE uma área do tamanho do arquivo adicionado.
◊Adicionar um novo TABLESPACE ao banco de dados. Nesta opção o novo TABLESPACE, 
que possui o tamanho do DATAFILE associado a ele, disponibiliza mais espaço para o banco 
de dados.
◊Aumentar o tamanho de um DATAFILE já associado a um TABLESPACE. Nesta opção o 
espaço adicional necessário a um TABLESPACE específico é adquirido pelo crescimento de 
um dos DATAFILES que compõem o TABLESPACE. Este incremento pode ser feito 
manualmente ou automaticamente.
CRIANDO UM TABLESPACE
A criação de um tablespace é feita com o comando CREATE TABLESPACE.
SINTAXE CREATE TABLESPACE
create_tablespace::=
(permanent_tablespace_clause, temporary_tablespace_clause, undo_tablespace_clause)
permanent_tablespace_clause::=
(file_specification ::= , size_clause ::= , logging_clause ::= , 
table_compression ::= , storage_clause ::= , 
extent_management_clause ::= , segment_management_clause ::= , 
flashback_mode_clause ::= )
logging_clause::=
table_compression::=
(storage_clause ::= )
extent_management_clause ::=
(size_clause ::= )
segment_management_clause ::=
flashback_mode_clause ::=
temporary_tablespace_clause::=
(file_specification ::= , tablespace_group_clause, 
extent_management_clause ::= )
tablespace_group_clause::=
undo_tablespace_clause::=
(file_specification ::= , extent_management_clause ::= , tablespace_retention_clause ::= )
tablespace_retention_clause ::=
Onde:
◊ tablespace - é o nome do tablespace a ser criado.
◊ DATAFILE ‘ filename ’ – corresponde ao nome do arquivo de dados.
◊ SIZE - especifica o tamanho do arquivo em K ou M.
◊ REUSE - permite que o ORACLE reutilize um arquivo existente.
◊ autoextend_clause – habilita ou desabilita o crescimento automático do DATAFILE 
correspondente.
◊ OFF – desabilita o crescimento automático. NEXT e MAXSIZE recebem o valor zero.
◊ ON – habilita o crescimento automático.
◊ maxsize_clause – determina o máximo de espaço em disco permitido para alocação 
para o DATAFILE.
◊ UNLIMITED – indica que não há limite para alocação de disco para o DATAFILE.
◊ MINIMUM EXTENT – visa o controle da fragmentação, assegurando que cada extensão 
no TABLESPACE tenha pelo menos o tamanho de integer ou seja um múltiplo deste 
tamanho.
◊ LOGGING / NOLOGGING – indica se determinadas operações serão logadas (noOnline 
redo Log) ou não. O default é LOGGING. Se especificarmos NOLOGGING, somente as 
operações de DML (direct-load INSERT – serial ou paralelo e Direct Loader do 
SQL*Loader) e DDL (create table as select, create index, alter index rebuild, alter index 
split partition, alter table split partition, alter index rebuild partition, alter table move 
partition) não serão registradas no LOG. As demais operações, independente da 
situação, continuarão a ser registradas. A intenção desta opção é permitir uma operação 
de construção de uma grande massa de dados mais rapidamente, porém, após o 
término desta, devemos efetuar uma salva para garantir a possibilidade de retrocesso.
◊ DEFAULT storage_clause – especifica as características defaults de armazenamento 
para todos os objetos a serem criados no TABLESPACE. Será estudado em detalhes no 
próximo capítulo.
◊ ONLINE - torna o tablespace disponível imediatamente após a criação para usuários que 
tenham acesso a ele.
◊ OFFLINE - torna o tablespace não disponível imediatamente após a criação.
◊ PERMANENT - especifica que o tablespace será usado para armazenar objetos 
permanentes. Esta é a opção default.
◊ TEMPORARY - especifica que o tablespace será usado somente para armazenar 
objetos temporários. (por exemplo, segmentos usados para ordenação implícita causada 
pelo uso de uma cláusula ORDER BY).
◊ extent_management_clause – especifica como as extensões do TABLESPACE serão 
administradas:
◊ DICTIONARY – indica que o TABLESPACE será administrado usando tabelas 
dicionário. Esta é a opção default.
◊ L OCAL – indica que o TABLESPACE é “locally managed”. Isto indica que parte do 
TABLESPACE é controlado por um BITMAP. Quando usamos esta cláusula não 
podemos especificar DEFAULT storage_clause, MINIMUM EXTENT ou 
TEMPORARY.
◊ AUTOALLOCATE – especifica que o TABLESPACE é gerenciado pelo sistema. 
Os usuários não podem determinar o tamanho de uma extensão. Esta é a opção 
default.
◊ UNIFORM – especifica que o TABLESPACE é gerenciado com extensões de 
tamanho uniforme. Devemos determinar este tamanho (em Kbytes ou Mbytes). O 
tamanho default é 1Mbyte.
OBS: 
◊ Quando um TABLESPACE é criado, seu estado inicial é READ-WRITE. Isto pode ser 
alterado posteriormente.
◊ Se omitirmos as opções ONLINE e OFFLINE, o ORACLE cria o TABLESPACE ONLINE, 
por default. A view do dicionário de dados chamada DBA_TABLESPACES indica o 
estado de cada tablespace.
◊ Se a opção REUSE for especificada, o arquivo deve existir, caso contrário a opção SIZE 
deve ser especificada e o arquivo não deve existir.
EXEMPLOS
Criar o tablespace TS_TESTE com um arquivo de dados chamado TS_TESTE.DBF de tamanho 
1M, tornando-o disponível imediatamente para uso.
A opção PCTINCREASE tem um valor default de 50. No exemplo foi usado zero (0) a fim de 
controlarmos (impedirmos) o crescimento de segmentos criados no tablespace.
Criar o tablespace TS_BIG com um arquivo de dados chamado TS_BIG.DBF de tamanho 1M.
Este tablespace poderá se expandir automaticamente desde que não ultrapasse o limite de 3M. 
A alocação de espaço neste tablespace deverá obedecer a múltiplos de 50K.
SQL> CREATE TABLESPACE ts_teste
 2 DATAFILE '/opt/oracle/oradata/orcl/ts_teste.dbf' SIZE 1M
 3 DEFAULT STORAGE (INITIAL 50K
 4 NEXT 50K
 5 MINEXTENTS 10
 6 MAXEXTENTS 121
 7 PCTINCREASE 0);
Espaço de tabela criado.
SQL> CREATE TABLESPACE ts_big
 2 DATAFILE '/opt/oracle/oradata/orcl/ts_big.dbf' SIZE 1M
 3 AUTOEXTEND ON MAXSIZE 3M
 4* MINIMUM EXTENT 50K
Espaço de tabela criado.
GERENCIANDO ESPAÇO EM TABLESPACES
Os TABLESPACES podem ter dois métodos de alocação interna de área para os objetos que 
viermos a criar dentro deles.
Quando criamos o TABLESPACE, indicamos qual o método de alocação de área. Isto não 
poderá ser modificado posteriormente.
DICTIONARY-MANAGED TABLESPACES
Neste método o Oracle atualiza as tabelas apropriadas no dicionário de dados quando uma 
extensão é alocada ou liberada para reuso (neste processo o Oracle também atualiza 
informações de rollback referente às alterações realizadas no dicionário de dados).
Este é o método default e o único disponível para as versões anteriores ao 9i.
LOCALLY-MANAGED TABLESPACES
Neste método, o tablespace gerencia suas próprias extensões através da manutenção de cada 
datafile de um BITMAP que indique o estado de cada bloco. Cada BIT no BITMAP corresponde 
a um bloco ou grupo de blocos. 
Quando uma extensão é alocada ou liberada para reuso, o Oracle altera os valores do BITMAP 
para indicar o novo estado dos blocos. Estas modificações não geram informação de rollback 
porque elas não atualizam as tabelas do dicionário de dados (exceto em casos especiais como 
“tablespace quota information”).
Como vantagem adicional temos que este método dispensa a necessidade de “coalesce” para 
as extensões adjacentes e livres. O tamanho das extensões pode ser determinado 
automaticamente pelo sistema.
OBS: se especificarmos a opção EXTENT MANAGEMENT LOCAL (no comando CREATE 
DATABASE) para o tablespace SYSTEM, os outros tablespaces no banco de dados podem 
variar na forma de armazenamento, no entanto, todos os segmentos de rollback devem ser 
criados em tablespaces gerenciados localmente.
TABLESPACES TEMPORÁRIOS
Podemos separar um tablespace para realização de operações de ordenação. Este uso traz 
como vantagem a eliminação do gerenciamento de espaço envolvendo operações de alocação 
de liberação de área para ordenação.
Os tablespaces temporários têm esta finalidade, isto é, realizar todas as operações de 
ordenação (SORT OPERATIONS) para uma determinada instância, incluindo joins, construção 
de índices, ORDER BY, GROUP BY e ANALYZE.
Estes tablespaces:
◊ Não podem conter qualquer objeto permanente.
◊ São gerenciados pelo DBA.
Para criarmos um tablespace temporário, devemos usar o comando CREATE TABLESPACE 
(com a opção TEMPORARY) ou CREATE TEMPORARY TABLESPACE.
OBS: A Oracle recomenda que:
◊Para um tablespace gerenciado localmente, usemos o comando CREATE TEMPORARY 
TABLESPACE.
◊Para um tablespace gerenciado pelo dicionário de dados usemos o comando CREATE 
TABLESPACE com a opção TEMPORARY.
Podemos também alterar um tablespace de permanente para temporário e de temporário para 
permanente usando o comando ALTER TABLESPACE.
SINTAXE CREATE TEMPORARY TABLESPACE
filespec
autoextend_clause
Onde : 
◊ TEMPFILE ‘ filename ’ – corresponde ao nome do arquivo de dados.
◊ SIZE - especifica o tamanho do arquivo em K ou M.
◊ REUSE - permite que o ORACLE reutilize um arquivo existente.
◊ autoextend_clause – habilita ou desabilita o crescimento automático do TEMPFILE 
correspondente.
◊ OFF – desabilita o crescimento automático. NEXT e MAXSIZE recebem o valor zero.
◊ ON – habilita o crescimento automático.
◊ maxsize_clause – determina o máximo de espaço em disco permitido para alocação 
para o TEMPFILE.
◊ UNLIMITED – indica que não há limite para alocação de disco para o DATAFILE.
◊ EXTENT MANAGEMENT LOCAL – especifica que o tablespace será administrado 
localmente (em relação a espaço), indicando que uma parte do tablespace contém um 
índice BITMAP.
◊ UNIFORM – determina o tamanho da extensão para tablespaces temporários. Todas as 
extensões terão o mesmo tamanho (uniforme). Se não determinarmos este tamanho, o 
Oracle considera 1M como tamanho default.
◊ SIZE - especifica o tamanho da extensão em K ou M.
OBS: A alocação e a liberação de espaço em um segmento de sort de um tablespace 
temporário pode ser vista na view V$SORT_SEGMENTS.
EXEMPLO
Criar um tablespace temporário em que cada extensão tenha exatamente 8M.
SQL> CREATE TEMPORARY TABLESPACE TS_TEMP01
 2 TEMPFILE '/opt/oracle/oradata/orcl/ts_temp01.dbf' SIZE 100M
 3 EXTENTMANAGEMENT LOCAL UNIFORM SIZE 8M;
Espaço de tabela criado.
TABLESPACES READ-ONLY
O principal propósito de um tablespace read-only é eliminar a necessidade de execução de 
backup e recovery de grandes pedaços do banco de dados que são estáticos (não mudam). 
Desta forma estes arquivos podem residir em uma mídia read-only (CD-ROMs ou drives 
WORM).
OBS: Quando criamos um novo tablespace, seu estado inicial é READ-WRITE. 
Antes do DBA tornar um tablespace READ-ONLY, as seguintes condições devem ser 
satisfeitas. 
OBS: É recomendado que atendamos estas restrições inicializando o banco de dados no modo 
restrito.
◊ O tablespace deve estar ONLINE.
◊ Não devem existir transações ativas.
◊ O tablespace não deve conter qualquer segmento de rollback ativo.
◊ O tablespace não deve estar envolvido (neste momento) em um backup online.
É recomendado que o DBA remova (DROP) os segmentos de rollback presentes neste 
tablespace antes de torna-lo READ-ONLY. 
OBS: O tablespace SYSTEM nunca pode se tornar um tablespace read-only.
EXEMPLOS
Usar o comando de SQL ALTER TABLESPACE para tornar um tablespace para read-only.
Usar o comando de SQL ALTER TABLESPACE para tornar um tablespace para read-write.
OBS: Para alterarmos o estado de um tablespace READ-ONLY para READ-WRITE, todos os 
arquivos de dados do tablespace devem estar online. Podemos usar a opção DATAFILE 
ONLINE do comando ALTER DATABASE para colocar um arquivo de dados online. 
A view V$DATAFILE lista o estado corrente de um arquivo de dados.
SQL> ALTER TABLESPACE tabspace_2 READ ONLY;
Tablespace altered.
SQL> ALTER TABLESPACE tabspace_2 READ WRITE;
Tablespace altered.
O comando ALTER TABLESPACE...READ ONLY coloca o tablespace no modo transitional 
read-only e aguarda que as transações existents (COMMIT ou rollback) para este tablespace se 
completem.
Este estado não permite qualquer operação de gravação para o tablespace, exceto rollback de 
transações existentes. Após todas as transações terem completado (com COMMIT ou 
ROLLBACK), a operação solicitada (READ ONLY) é concluída e o estado do tablespace é 
modificado.
OBS: Este estado “transitional” somente ocorre se o valor do parâmetro de inicialização 
COMPATIBLE for 8.1.0 ou maior. Para parâmetros inferiores a este valor, o comando ALTER 
TABLESPACE READ ONLY falha se houver qualquer transação em atividade.
Uma vez que tablespaces read-only não podem ser modificados, eles não precisam ser salvos 
repetidamente. Quando necessitarmos recuperar o banco de dados, não precisamos nos 
preocupar, porque eles não foram modificados. 
Podemos remover itens (tabelas, índices, etc) de um tablespace read-only, da mesma forma 
que podemos remover itens de um tablespace offline, porém não podemos criar ou alterar 
objetos. 
Por outro lado, também não podemos adicionar DATAFILES a este tipo de tablespace, mesmo 
se o colocarmos offline (quando adicionamos um datafile, o Oracle deve atualizar o file header 
do arquivo e esta operação de gravação não é permitida para tablespaces read-only).
TABLESPACES OFFLINE
Um DBA pode colocar qualquer tablespace (excetuando-se o SYSTEM) ONLINE ou OFFLINE 
enquanto o banco de dados estiver aberto.
O tablespace SYSTEM sempre deverá estar ONLINE quando o banco de dados estiver aberto 
porque o dicionário de dados deve estar sempre disponível para o Oracle.
Os objetivos de colocarmos um tablespace no estado OFFLINE seriam:
◊Tornar uma porção do banco de dados indisponível para os usuários, por exemplo deixar 
uma aplicação e seu grupo de tabelas temporariamente não disponíveis enquanto estiver 
sendo feita uma atualização ou manutenção da aplicação.
◊Executar um backup offline do tablespace (apesar do backup online ser possível).
OBS: Não podemos colocar um tablespace OFFLINE se ele tiver qualquer segmento de rollback 
que esteja em uso.
Quando um tablespace vai para OFFLINE, o Oracle não permite que qualquer subseqüente 
comando de SQL faça referência a objetos contidos naquele tablespace. Transações ativas com 
comandos completados que façam referência a dados naquele tablespace não são afetadas a 
nível de transação. O Oracle salva os dados de rollback correspondentes àqueles comandos 
completados em um segmento de rollback DEFERRED (no tablespace SYSTEM). Quando o 
tablespace retorna ao estado ONLINE, o Oracle aplica aqueles dados de rollback para o 
tablespace, se for necessário.
A mudança de estado para um tablespace é registrada no dicionário de dados. Desta forma se 
um tablespace estiver offline quando o banco de dados sair de atividade, o tablespace 
permanece offline quando ele for montado e reaberto.
Somente podemos colocar um tablespace online no banco de dados no qual ele foi criado uma 
vez que é necessário que esta informação seja mantida pelo dicionário de dados. Já que um 
tablespace offline não pode ser lido ou gravado, um tablespace neste estado não pode ser 
transferido entre bancos de dados.
O Oracle, automaticamente, troca o estado do tablespace (para offline) quando certos erros são 
encontrados (por exemplo quando o DBWR falha várias vezes na tentativa de gravar alguma 
informação para o tablespace). Se a causa deste erro de I/O de disco for falha de meio físico, 
devemos recuperar o tablespace após havermos corrigido o problema de hardware.
OBS: Apesar de ser bastante conveniente e interessante que separemos os dados em 
tablespaces distintos visando performance, alguns cuidados devem ser tomados quando 
colocamos um determinado tablespace offline:
◊Se um tablespace contendo índices estiver offline (e o de dados não), as queries poderão 
ter acesso aos dados, porém o uso dos índices para tal estará vedado.
◊Se o tablespace com as tabelas estiver offline, o acesso aos dados é vedado.
ALTERANDO O TABLESPACE
A alteração de um tablespace permite que: 
◊ modifiquemos seus parâmetros de armazenamento default;
◊ tornemos o tablespace online ou offline,
◊ acrescentemos outros arquivos de dados,
◊ façamos a substituição (renomear) dos nomes dos arquivos de dados existentes,
◊ realizemos sua salva (backup).
sintaxe ALTER TABLESPACE
alter_tablespace::=
(table_compression ::= --part of ALTER TABLE, storage_clause ::= , 
size_clause ::= , datafile_tempfile_clauses ::= , 
tablespace_logging_clauses ::= , tablespace_group_clause ::= , 
tablespace_state_clauses ::= , autoextend_clause ::= , 
flashback_mode_clause ::= , tablespace_retention_clause ::= )
datafile_tempfile_clauses ::=
(file_specification ::= ).
tablespace_logging_clauses ::=
(logging_clause ::= )
tablespace_group_clause::=
tablespace_state_clauses::=
autoextend_clause ::=
(size_clause ::= )
maxsize_clause::=
(size_clause ::= )
flashback_mode_clause ::=
tablespace_retention_clause::=
Onde:
◊ tablespace - é o nome do tablespace a ser alterado.
◊ LOGGING / NOLOGGING – indica se determinadas operações serão logadas (no Online 
redo Log) ou não. O default é LOGGING. Se especificarmos NOLOGGING, somente as 
operações de DML (direct-load INSERT – serial ou paralelo e Direct Loader do 
SQL*Loader) e DDL (create table as select, create index, alter index rebuild, alter index 
split partition, alter table split partition, alter index rebuild partition, alter table move 
partition) não serão registradas no LOG. As demais operações, independente da 
situação, continuarão a ser registradas. A intenção desta opção é permitir uma operação 
de construção de uma grande massa de dados mais rapidamente, porém, após o 
término desta, devemos efetuar uma salva para garantir a possibilidade de retrocesso.
◊ DATAFILE ‘ filename ’ ou TEMPFILE ‘ filename’ – corresponde ao nome do arquivo de 
dados.
◊ SIZE - especifica o tamanho do arquivo em K ou M.
◊ REUSE - permite que o ORACLE reutilize um arquivo existente.
◊ autoextend_clause– habilita ou desabilita o crescimento automático do DATAFILE 
correspondente.
◊ OFF – desabilita o crescimento automático. NEXT e MAXSIZE recebem o valor zero.
◊ ON – habilita o crescimento automático.
◊ maxsize_clause – determina o máximo de espaço em disco permitido para alocação 
para o DATAFILE.
◊ UNLIMITED – indica que não há limite para alocação de disco para o DATAFILE.
◊ DEFAULT storage_clause – especifica as características defaults de armazenamento 
para todos os objetos a serem criados no TABLESPACE. Será estudado em detalhes no 
próximo capítulo.
◊ MINIMUM EXTENT – visa o controle da fragmentação, assegurando que cada extensão 
no TABLESPACE tenha pelo menos o tamanho de integer ou seja um múltiplo deste 
tamanho.
◊ ONLINE - torna o tablespace disponível imediatamente após a criação para usuários que 
tenham acesso a ele.
◊ OFFLINE - torna o tablespace indisponível e impede futuros acessos a este objeto.
◊ NORMAL – libera todos os blocos em todos os DATAFILES do tablespace fora da 
SGA. Não há necessidade de MEDIA RECOVERY neste tablespace antes de torná-
lo online novamente. Esta é a opção default.
◊ TEMPORARY – executa um CHECKPOINT para todos os DATAFILES do tablespace 
que estiverem online mas não assegura que todos os arquivos possam ser gravados. 
Qualquer dos arquivo offline pode requerer MEDIA RECOVERY antes do tablespace 
ser colocado novamente online.
◊ IMMEDIATE – não se assegura que os arquivos do tablespace estejam disponíveis e 
não executa um CHECKPOINT. Devemos executar MEDIA RECOVERY no 
tablespace antes deste voltar a ficar online.
◊ FOR RECOVERY – coloca o tablespace no estado próprio para recuperação 
baseada no tempo (point-in-time recovery).
◊ BEGIN / END BACKUP – indica ao Oracle que será iniciado (ou está sendo terminado) 
um BACKUP ONLINE para este tablespace.
◊ PERMANENT - especifica que o tablespace será usado para armazenar objetos 
permanentes.
◊ TEMPORARY - especifica que o tablespace será usado somente para armazenar 
objetos temporários. (por exemplo, segmentos usados para ordenação implícita causada 
pelo uso de uma cláusula ORDER BY).
◊ COALESCE – indica que em todos os DATAFILES no tablespace, as extensões 
contíguas devem se unir em grandes extensões. Esta opção não pode ser utilizada com 
qualquer outra cláusula.
EXEMPLOS
Alterar o tablespace TS_TEMP adicionando um novo DATAFILE. Garantir que a alocação de 
extensões se faça em múltiplos de 64K.
SQL> ALTER TABLESPACE TS_TEMP
 2 ADD DATAFILE '/opt/oracle/oradata/orcl/ts_temp02.dbf'
 3 SIZE 1M
 4 AUTOEXTEND ON
 5 NEXT 500K
 6 MAXSIZE 5M;
Espaço de tabela alterado.
SQL> ALTER TABLESPACE TS_TEMP
 2 MINIMUM EXTENT 64K;
Espaço de tabela alterado.
REMOVENDO TABLESPACES
Esta operação remove um tablespace do banco de dados quando o tablespace e seu conteúdo 
não é mais necessário para o banco de dados. 
SINTAXE DROP TABLESPACE
Onde:
◊ tablespace - especifica o nome do tablespace a ser retirado.
◊ INCLUDING CONTENTS - Retira todo o conteúdo do tablespace.
◊ CASCADE CONSTRAINTS - Retira todas as restrições de integridade referencial das 
tabelas fora do tablespace que façam referência a tabelas de dentro do tablespace.
OBS:
◊ Um tablespace que ainda contém dados não pode ser retirado sem a utilização da opção 
INCLUDING CONTENTS.
◊ Uma vez que o tablespace tenha sido retirado, seus dados não existirão mais para o 
banco de dados.
◊ Quando um tablespace é retirado, somente os ponteiros para arquivos no arquivo de 
controle são removidos do banco de dados. Os arquivos físicos continuam existindo e 
devem ser removidos, explicitamente, por comandos do sistema operacional.
◊ Mesmo que um tablespace seja movido para read only, ele pode ainda ser removido, 
assim como os segmentos dentro dele. Isto é possível porque o comando DROP 
simplesmente atualiza o dicionário de dados (que tem de ser read write) e não os 
arquivos físicos que compõem o tablespace.
EXEMPLO
Remover o tablespace TS_TEMP01.
SQL> DROP TABLESPACE TS_TEMP01 
 2 INCLUDING CONTENTS CASCADE CONSTRAINTS;
Espaço de tabela eliminado.
DATAFILES
Um tablespace em um banco de dados Oracle consiste de um ou mais arquivos físicos 
chamados DATAFILES. Um DATAFILE pode estar associado a somente um tablespace e 
somente um banco de dados.
O Oracle cria um DATAFILE para um tablespace alocando uma quantidade específica de disco 
adicionado do overhead necessário para o header do arquivo. O sistema operacional no qual o 
Oracle está executando é responsável por realizar a alocação física real.
Como o primeiro tablespace é sempre o SYSTEM, o Oracle, automaticamente, aloca o primeiro 
DATAFILE de qualquer database para o tablespace SYSTEM durante a criação do banco de 
dados.
Quando incluímos tabelas e outros objetos em um tablespace o espaço interno vai sendo 
alocado de acordo com a requisição específica de espaço. O schema não está associado a um 
DATAFILE específico. Um DATAFILE é um repositório para dados de qualquer schema dentro 
de um tablespace específico.
Se o tablespace específico tiver mais de um DATAFILE, o Oracle poderá alocar espaço em um 
ou mais DATAFILES do tablespace, ou seja, um objeto pode estar distribuído em mais de um 
DATAFILE. O DBA não tem controle sobre a alocação de espaço nos DATAFILES do 
tablespace.
REDIMENSIONAMENTO AUTOMÁTICO
O tamanho de um arquivo de dados pode ser alterado, automaticamente, através da opção 
AUTOEXTEND ou manualmente usando-se o comando ALTER DATABASE.
O comando AUTOEXTEND habilita ou desabilita a extensão de arquivos de dados. Quando um 
arquivo de dados é criado, os comandos SQL abaixo podem ser usados para especificar que os 
arquivos cresçam automaticamente:
◊ CREATE DATABASE
◊ CREATE TABLESPACE
◊ ALTER TABLESPACE
◊ ALTER DATABASE
Esta funcionalidade permite que tenhamos poucos DATAFILES por tablespace, o que pode 
simplificar a administração dos DATAFILES.
EXEMPLOS
Alterar o tablespace USERS adicionando um DATAFILE de 10M. Este DATAFILE deve se 
extender automaticamente até um limite de 250M.
Usar o comando ALTER DATABASE para habilitar ou desabilitar a extensão automática de um 
arquivo de dados existente
REDIMENSIONAMENTO MANUAL
Podemos usar o comando ALTER DATABASE para manualmente incrementar ou decrementar 
o tamanho de um arquivo de dados.
Uma vez que é possível a modificação no tamanho de um arquivo de dados, podemos adicionar 
mais espaço ao banco de dados sem haver necessidade de adicionarmos mais arquivos de 
dados. Por outro lado, podemos corrigir erros de estimativa de requerimentos de espaço se 
devolvermos ao sistema operacional espaço não utilizado no banco de dados.
SQL> ALTER DATABASE
 2 DATAFILE 'users02'
 3 AUTOEXTEND OFF;
Statement processed.
SQL> ALTER DATABASE
 2 DATAFILE 'users02'
 3 RESIZE 100M;
Statement processed.
SQL> ALTER TABLESPACE users
 2 ADD DATAFILE 'users02' SIZE 10M 
 3 AUTOEXTEND ON NEXT 512K MAXSIZE 250M;
Statement processed.
DATAFILES TEMPORÁRIOS
Tablespaces temporários gerenciados localmente possuem DATAFILES temporários 
(TEMPFILES), que são similares a DATAFILES normais, exceto que:
◊TEMPFILES estão sempre no modo NOLOGGING.
◊Não podemos definí-los como READ-ONLY.
◊Não podemos renomeá-los.
◊Não podemos criar um TEMPFILE com o comando ALTER DATABASE.
◊MEDIA RECOVERY não reconhece TEMPFILES:
o BACKUP CONTROLFILE não gera qualquer informação para TEMPFILES.
o CREATE CONTROLFILE não especifica qualquer informação sobre 
TEMPFILES.
◊Informações sobre TEMPFILES são apresentadas pela view DBA_TEMP_FILES e pela 
view dinâmica V$TEMPFILE mas não são visíveis pela view DBA_DATA_FILES ou 
V$DATAFILE.
CONSIDERAÇÕES FINAIS SOBRE TABLESPACES
Existem três regras para gerenciamento de tablespaces.
1. Devemos usar múltiplos tablespaces.
Autilização de múltiplos tablespace permite que tenhamos mais flexibilidade na execução 
de operações sobre o banco de dados.
◊ Separar dados do usuário de dados do dicionário de dados.
◊ Separar dados de uma aplicação de dados de outras aplicações.
◊ Armazenar arquivos de dados de diferentes tablespaces em discos diferentes para 
reduzir a contenção de I/O.
◊ Separar segmentos de rollback de segmentos de dados, prevenindo que uma simples 
falha de disco cause perda de dados.
◊ Possibilidade de colocar tablespaces individuais fora de uso (offline) enquanto outros 
permanecem online.
◊ Reservar tablespaces para um tipo particular de uso do banco de dados, tais como : 
grandes atividades de atualização, atividades somente de consulta, armazenamento de 
segmentos temporários.
◊ Backup de tablespaces individuais.
2. Devemos especificar os parâmetros de armazenamento (storage) para o tablespace.
◊ Especificar os parâmetros de armazenamento default (default storage) para objetos que 
serão criados no tablespace.
◊ Determina estes valores defaults para um tamanho típico de objeto que será criado no 
tablespace.
3. Devemos associar cotas de espaço para os usuários.
◊ Associar cotas de espaço, quando necessário, para os usuários do banco de dados.
 
EXTENSÕES, BLOCOS DE DADOS E 
SEGMENTOS
No esquema abaixo encontramos os principais componentes para administração do espaço 
interno em um Tablespace.
O Oracle é responsável pela alocação de área para todos os dados no banco de dados. A 
unidade básica de alocação de área é o bloco Oracle, também chamado de bloco de dados, 
bloco lógico ou página. Um bloco Oracle corresponde à menor unidade de leitura ou gravação 
feita pelo banco de dados.
Quando reservamos espaço para acomodação dos dados de uma tabela (por exemplo), 
informamos o tamanho a ser alocado em extensões. Uma extensão é uma porção de área 
contínua no Tablespace múltipla do bloco Oracle. Quando criamos a tabela, é alocada a 
extensão inicial. Quando a tabela cresce é alocada uma nova extensão para ela.
Ao conjunto de extensões associadas a um mesmo objeto chamamos de segmento. Um 
segmento, portanto, é um conjunto de extensões, alocadas para uma estrutura de dados 
específica e armazenadas no mesmo tablespace.
Por exemplo, cada tabela armazena seus dados em segmentos de dados, os índices 
armazenam seus dados em segmentos de índice e assim por diante. O tipo do segmento 
depende da informação armazenada.
Um segmento, ou seja, todas as suas extensões são armazenadas em um único tablespace. No 
entanto, como um tablespace pode ser composto de mais de um datafile, um determinado 
segmento pode conter extensões acomodadas em datafiles diferentes. Um extensão, 
entretanto, só pode conter dados de um único datafile.
Tablespace
Bloco Oracle
Extensão
Segmento
BLOCOS DE DADOS
Um bloco de dados ORACLE é a menor unidade de leitura e gravação (I/O) usada pelo banco 
de dados.
O DBA determina o tamanho de um bloco de dados Oracle quando o banco de dados é criado. 
Este tamanho deve ser múltiplo do tamanho de bloco do sistema operacional (seu valor limite 
depende do sistema operacional). 
O bloco de dados ORACLE é a menor unidade de armazenamento que o banco de dados pode 
se utilizar para alocação.
CARACTERÍSTICAS
◊ Também são chamados de blocos lógicos e blocos ORACLE Server.
◊ Correspondem a um ou mais blocos físicos do sistema operacional.
◊ Seu tamanho é determinado a tempo de criação do banco de dados pelo parâmetro de 
inicialização DB_BLOCK_SIZE e é o mesmo para todos os arquivos de dados.
◊ Este tamanho também determina o tamanho de cada database buffer na SGA.
◊ O tamanho do bloco não pode ser alterado após a criação do banco de dados, exceto 
criando-se o banco novamente.
◊ Os blocos ORACLE, por default , possuem o tamanho de 2K ou 4K bytes. Este tamanho 
depende do sistema operacional.
◊ Em algumas plataformas, o tamanho do bloco de dados pode ser muito grande (por 
exemplo 32Kb). Isto é conhecido como um Big Oracle Block.
◊ Todas as operações de I/O são feitas com o tamanho do bloco (ou múltiplos). 
FORMATO
O formato de um bloco ORACLE é semelhante, independente do bloco conter tabelas, índices 
ou clusters. É subdividido nas seguintes partes :
◊ HEADER - Contém informações gerais do bloco, tais como o endereço do bloco e o tipo 
de segmento.
◊ TABLE DIRECTORY - Armazena informações sobre as tabelas em um cluster e é usado 
junto com segmentos de cluster.
◊ ROW DIRECTORY - Contém informações sobre as linhas existentes no bloco. Inclusive 
endereçamento para cada pedaço de linha na área de dados. Causa um overhead de 
dois bytes por linha.
Uma vez que um espaço tenha sido alocado na área de diretório de linhas, quando a 
linha é removida, este espaço não é mais retornado ao bloco. O Oracle reusa este 
espaço somente quando novas linhas forem incluídas no bloco.
◊ OVERHEAD – As áreas de Header, Table Directory e Row Directory são, algumas 
vezes, referenciadas, coletivamente como OVERHEAD. Em média, a porção fixa e a 
porção variável da área de OVERHEAD fica entre 84 e 107 bytes.
sentido de 
crescimento 
da informação
◊ FREE SPACE - Consiste de um conjunto de bytes no bloco, que está disponível, para 
ser utilizado na inserção ou atualização de linhas.
Na área livre dos blocos de dados de tabelas, clusters ou índices, também são 
armazenados TRANSACTION ENTRIES. Um TRANSACTION ENTY é necessária em 
um bloco para cada operação de INSERT, UPDATE, DELETE e SELECT ... FOR 
UPDATE que faça acesso a uma ou mais linhas do bloco.
O tamanho de uma TRANSACTION ENTRY depende do sistema operacional mas, de 
um modo geral, fica em torno de 23 bytes.
As transaction entries são necessárias para garantir o bloqueio a nível de linha.
◊ ROW DATA - Área para armazenamento dos dados em si. Uma linha pode ter pedaços 
em mais de um bloco.
OS PARÂMETROS PARA ALOCAÇÃO DE ESPAÇO EM BLOCOS
Para controlar o uso de espaço disponível para inclusões, atualizações ou exclusões de linhas 
em blocos do banco de dados devemos utilizar valores apropriados para os parâmetros 
PCTFREE e PCTUSED. Estes parâmetros são especificados a tempo de criação ou alteração 
de uma tabela ou cluster.
Resumidamente, temos: 
◊ PCTFREE - Especifica a percentagem de espaço, em cada bloco, a ser reservada para 
futuras atualizações de linhas da tabela (crescimento). O valor default para PCTFREE é 
de 10%.
◊ PCTUSED - Especifica o percentual mínimo de espaço usado que o Oracle mantém para 
cada bloco de dados de uma tabela. Um bloco torna-se candidato a novas inclusões 
quando a quantidade de espaço usado torna-se inferior a PCTUSED. O valor default 
para PCTUSED é de 40%.
◊ INITRANS - Indica o número de transaction entries alocadas inicialmente no header do 
bloco. O default é 1 para tabelas e 2 para clusters e índices.
◊ MAXTRANS - indica o número máximo de transações que podem fazer acesso ao bloco 
concorrentemente.
OBS: 
◊ Os parâmetros PCTFREE e PCTUSED permitem o controle de uso do espaço disponível 
para inclusões ou atualizações de linhas nos blocos de dados. 
◊ Ambos os parâmetros podem ser atribuídos a tabelas, clusters e snapshots através dos 
comandos CREATE e ALTER.
◊ PCTFREE também pode ser especificado para índices.
◊ A soma de PCTFREE e PCTUSED deve ser menor ou igual a 100.
PCTFREE
Este valor indica a percentagem mínima de espaço a ser reservado (deixado livre) no bloco 
para possíveis atualizações de linha que já estejam contidas no bloco.
Como características principais, temos:
◊ PCTFREE indica a percentagem de espaço não 
utilizável, reservado durante a fase de inserção para 
possíveis atualizações de linhas contidas no bloco.
◊ O valor default é de 10%.
◊ Após PCTFREE ser atingido, o bloco é considerado 
cheio e não é disponibilizado para novas inserções de 
linhas (sai da freelist).
◊ O espaço remanescente no bloco após o valor de 
PCTFREE ter sido atingido é reservado para os 
comandos UPDATE em linhas de dentro do bloco.
◊ O parâmetro PCTFREE também pode ser especificado na criação ou alteração de 
índices.
◊ O espaço livre é preenchido pela inclusão de novas linhas, pelo crescimento das linhas 
existentes e pelo crescimento do header do bloco de dados.
◊ Quando especificado para índices, PCTFREE reserva espaço para inclusões e 
atualizações. Free space é calculado como uma porcentagem de DB_BLOCK_SIZE 
menos o header.
No exemplo, quando a área livre atingir 20% (ou menos), o Oracle retirará este bloco da FREE 
LIST.
PCTUSED
Este valor indica a quantidade mínima de área em uso no bloco para que o mesmo seja 
reconsiderado para inclusão de novas linhas.
A inclusão de novas linhas só é possível quando o bloco está na FREE LIST.
Um bloco é removido da FREE LIST quando a quantidade de área livre fica abaixo do valor 
especificado para PCTFREE e retorna à FREE LIST quando a quantidade de área ocupada fica 
abaixo do PCTUSED.
Até este valor ser atingido o Oracle usa o espaço livre apenas para atualizações de linhas já 
contidas no bloco de dados.
Como características, temos:
◊ PCTUSED é um limite para determinar quando o 
bloco estará disponível para inclusão de novas 
linhas.
◊ Quando o percentual usado (preenchido) do bloco é 
menor ou igual a PCTUSED, resultante da exclusão 
de linhas ou atualizações reduzindo o comprimento 
da linha, o bloco torna-se novamente disponível para 
inserção de novas linhas.
◊ O valor default de PCTUSED é de 40%.
No exemplo, uma vez que PCTUSED recebeu o valor de 40%, somente quando houver em 
torno de 61% de área livre este bloco estará apto a ser reincluído na FREE LIST.
OBS: A FREE LIST é uma lista de ponteiros para blocos que podem ser usados para inclusão 
de novas linhas. Os blocos são incluídos e removidos da FREE LIST de acordo com os valores 
atribuídos a PCTUSED e PCTFREE.
ANALISANDO OS VALORES DE PCTFREE E PCTUSED
Podemos incrementar performance e espaço de utilização através de valores adequados para 
PCTFREE e PCTUSED.
USANDO UM VALOR BAIXO PARA PCTFREE:
◊ permite que as operações de inclusão preencham os blocos mais completamente.
◊ pode requerer poucos blocos para armazenamento de dados.
◊ pode incrementar os custos do processamento se o servidor tiver de muito 
freqüentemente reorganizar os blocos.
◊ pode causar migração de linhas.
USANDO UM VALOR ALTO PARA PCTFREE
◊ reserva mais área para futuras atualizações.
◊ pode requerer mais blocos para armazenamento dos dados.
◊ os custos de processamentos serão baixos porque os blocos irão requerer 
reorganização pouco freqüentemente.
◊ reduz a possibilidade de encadeamento de linhas.
USANDO UM VALOR BAIXO PARA PCTUSED
◊ reduz o custo de processamento porque os blocos não ficam freqüentemente livres.
◊ aumenta o espaço sem uso.
USANDO UM VALOR ALTO PARA PCTUSED
◊ aumenta os custos de processamento porque os blocos podem se tornar freqüentemente 
livres.
◊ melhora o uso de espaço.
O compromisso ideal de utilização de espaço e performance de I/O é uma soma de PCTFREE e 
PCTUSED que seja menor que 100% pela percentagem de espaço representado pelo tamanho 
médio de uma row. 
Por exemplo, suponhamos que um bloco tenha o tamanho de 2048 bytes menos 100 bytes de 
overhead, deixando 1948 bytes disponíveis para dados. 
Se o tamanho médio de uma linha é de 195 bytes (10% de 1948), então, uma combinação 
apropriada de PCTUSED e PCTFREE que some 90% resulta no melhor uso de espaço para o 
banco de dados.
A fórmula a seguir formaliza a este resultado:
PCTUSED + PCTFREE = (área para dados no bloco – tamanho médio de uma linha) * 100
área para dados no bloco
EXEMPLO
Neste exemplo utilizamos PCTFREE com 20% e PCTUSED com 40%.
◊As linhas são incluídas no bloco até que o total usado seja de 80%, já que 20% deve 
permanecer livre para atualização das linhas existentes.
◊A atualização das linhas existentes pode usar o espaço livre reservado no bloco. Nenhuma 
nova linha pode ser incluída até que a quantidade de espaço usado seja menor que 40%.
◊Quando a quantidade de espaço livre atinge 61% (aproximadamente), ou seja, a quantidade 
de espaço usado fica inferior a 40%, novas linhas podem ser incluídas novamente neste 
bloco.
◊Novamente retornamos à situação em que as inclusões podem ocorrer até que o total 
usado seja de 80%. Este ciclo continua indefinidamente.
OBS: O incremento do parâmetro PCTFREE reduz a ocorrência de migração de linhas. Um 
valor muito pequeno para PCTFREE pode resultar na necessidade de migração de linhas.
CONSIDERAÇÕES SOBRE PCTUSED E PCTFREE
◊Em um bloco recém alocado, a área disponível para inclusões corresponde ao tamanho do 
bloco menos o overhead (para o header) menos o valor de PCTFREE.
◊As atualizações, no bloco, podem utilizar a área livre, reduzindo a área disponibilizada para 
inclusões.
◊Para cada segmento de dados e de índice, o Oracle mantém uma ou mais FREE LISTS 
(listas de blocos de dados que tenham sido alocados para aquele segmento e que tenham 
espaço livre maior que PCTFREE).
◊Quando executamos um comando INSERT o ORACLE checa a FREE LIST da tabela para 
o primeiro bloco disponível e usa-o, se possível.
◊Se o espaço livre naquele bloco não é grande o suficiente para acomodar a nova linha e o 
bloco tem pelo menos PCTUSED, o ORACLE tira aquele bloco da FREE LIST.
◊Múltiplas FREE LISTS por segmento podem reduzir a contenção sobre as FREE LISTS 
quando inserts concorrentes ocorrerem.
◊Após executarmos um comando DELETE ou UPDATE, o ORACLE processa o comando e 
verifica se o espaço usado no bloco é, agora, menos que o PCTUSED. Se isto ocorrer, o 
bloco retorna para a FREE LISTe torna-se o primeiro bloco disponível a ser usado naquela 
transação. Quando a transação efetua um COMMIT, o espaço livre no bloco torna-se 
disponível para outras transações.
◊Dois tipos de comandos podem incrementar o espaço livre em um bloco de dados: DELE e 
UPDATE (quando diminui o valor de um campo). O espaço liberado estará disponível para 
subseqüentes comandos INSERTs se:
o O comando INSERT estiver na mesma transação e for posterior ao comando que 
liberou o espaço.
o O comando INSERT está em outra transação e a transação atual efetuou um 
COMMIT.
◊O espaço disponível no bloco pode ou não ser contínuo. O ORACLE junta este espaço no 
bloco de dados somente quando:
o Um comando INSERT ou UPDATE tentou usar o bloco que contém o espaço 
disponível para adicionar um novo pedaço de linha e o espaço disponível está 
fragmentado impedindo que o pedaço de linha seja incluído em um trecho 
contínuo do bloco. 
O ORACLE somente realiza a compressão nesta situação porque, caso contrário, a 
performance do banco de dados poderia ser decrementada em função de um trabalho 
contínuo de compressão.
ENCADEAMENTO E MIGRAÇÃO DE LINHAS
Devemos monitorar (controlar) o encadeamento e migração para diminuir a possibilidade de 
degradação de performance.
Em duas situações os dados de uma linha podem ser muito grandes para caberem em um 
único bloco:
◊No primeiro caso a linha é muito grande para caber no bloco de dados quando ela é 
incluída. Neste caso o Oracle armazena o dado para a linha em uma cadeia de blocos de 
dados (um ou mais). Este tipo de situação é comum quando temos colunas do tipo LONG / 
CLOB ou LONG RAW / BLOB. Neste caso não é possível ao DBA desfazer o encadeamento.
◊No segundo caso a linha, inicialmente, cabia no bloco e é atualizada (UPDATE), com seu 
tamanho sendo incrementado, não havendo espaço livre no bloco para a nova linha neste 
mesmo bloco. Neste caso o ORACLE migra o dado da linha inteira para um novo bloco 
(considerando-se que isto seja possível). O ORACLE preserva um pedaço da linha original 
da linha migrada a fim de apontar para o novo bloco contendo o restanteda linha. O rowid da 
linha migrada não se modifica.
ENCADEAMENTO
◊ Uma linha que não cabe dentro de um único bloco pode ser encadeada através de 
múltiplos blocos.
◊ A parte inicial da linha permanece no bloco onde a linha for inicialmente incluída.
◊ Cada pedaço adicional é colocado em um bloco encadeado.
MIGRAÇÃO
◊ Uma linha migrada é movida inteiramente de seu bloco original para um bloco 
encadeado.
◊ Uma row migra quando uma operação de atualização modifica a linha de tal forma que 
ela precisa de mais espaço que aquele disponibilizado no bloco.
◊ Ao usarmos um valor alto em PCTFREE estaremos diminuindo a probabilidade de 
migração de linhas.
OBS: conjuntos de colunas NULL (trailing NULL columns) ao fim de uma linha não são 
armazenados se adicionados à estrutura da tabela usando-se o comando ALTER TABLE.
Quando uma linha é encadeada ou migrada, a performande (I/O) associada com esta linha 
decrementa porque o ORACLE deve pesquisar mais de um bloco de dados para recuperar toda 
a informação para a linha.
ANALISANDO ENCADEAMENTO E MIGRAÇÃO
Os parâmetros PCTFREE e PCTUSED trabalham juntos para otimizar a utilização de espaço 
nos blocos de dados.
Ao incrementarmos o valor do parâmetro PCTFREE reduziremos a ocorrência de migração de 
linhas.
ENCADEAMENTO x MIGRAÇÃO
◊ O encadeamento ocorre com grandes linhas de dados (por exemplo, que contenham 
colunas Long) quando toda a linha não cabe em um único bloco.
◊ A migração ocorre se uma linha de um bloco for atualizada, seu tamanho aumentar e o 
espaço livre do bloco não for suficiente para conter a linha. A linha inteira é migrada para 
um novo bloco de dados.
EFEITOS SOBRE A PERFORMANCE
◊ A performance de I/O é diminuída quando é feita leitura em cadeias ou linhas migradas.
◊ O ORACLE deve pesquisar mais de um bloco de dados para obter a informação de uma 
linha.
OTIMIZANDO A PERFORMANCE
◊ Devemos examinar a seqüência de cadeias ou migrações com o procedimento de 
calculo de estatísticas. 
◊ Alterar o parâmetro PCTFREE para o objeto.
◊ Executar os comandos EXPORT, DROP e IMPORT para o objeto.
INITRANS E MAXTRANS
A determinação do número de transações ativas em um único bloco é feita com os parâmetros 
INITRANS e MAXTRANS.
Cada transação que atualiza um bloco precisa de uma TRANSACTION ENTRY no bloco. O 
tamanho desta depende do sistema operacional (de um modo geral em torno de 23 bytes).
INITRANS
◊ é o número inicial de transaction entries, para transações concorrentes, que são 
alocadas no header do bloco, quando o bloco é alocado (o valor default é 1, que 
corresponde ao mínimo válido e o máximo é 255). De um modo geral não devemos 
alterar este valor.
◊ Este parâmetro tem a mesma finalidade tanto em partições, clusters, índices, snapshots 
e snapshot logs quanto em tabelas, sendo que o valor default para um cluster ou índice é 
2 em vez de 1.
MAXTRANS
◊ é o número máximo de transações concorrentes que o bloco irá suportar (máximo de 
255).
◊ o valor default de MAXTRANS depende do sistema operacional, mas é usualmente de 
255. Não devemos modificar este valor máximo.
◊ cada transação necessitará de, aproximadamente, 23 bytes do free space do bloco. Se o 
free space do bloco estiver sendo usado, as transações terão de aguardar para fazer 
acesso ao bloco.
◊ Este parâmetro tem a mesma finalidade tanto em partições, clusters, índices, snapshots 
e snapshot logs quanto em tabelas .
OBS: Quando a área livre do bloco (FREE SPACE) é alocada para uma transaction entry, ela 
torna-se permanentemente incorporada ao HEADER.
EXTENSÕES
Uma extensão é um conjunto contínuo de blocos de dados. Poderíamos dizer que uma 
extensão é uma unidade lógica de alocação de espaço no banco de dados de um número 
contínuo de blocos de dados.
Uma ou mais extensões compõem um segmento. Quando o espaço existente para um 
determinado segmento é completamente usado, o Oracle aloca uma nova extensão para aquele 
segmento.
CARACTERÍSTICAS
◊ Cada segmento no banco de dados é criado com pelo menos uma extensão para 
comportar seus dados. O segmento de rollback, porém, sempre possui pelos menos 
duas extensões.
◊ A primeira extensão de cada segmento é chamada de initial extent.
◊ Subseqüentes extensões são chamadas de extensões incrementais.
◊ Um objeto irá alocar somente uma nova extensão se todas as áreas nas extensões 
alocadas atualmente estiverem preenchidas.
◊ Freqüentemente a de-allocation de extensões pode levar à fragmentação do tablespace.
◊ A INITIAL EXTENT é um pedaço de espaço pré-reservado dentro do banco de dados. 
Quando a INITIAL EXTENT é preenchida, a NEXT EXTENT é alocada.
Tablespace
Bloco Oracle
Extensão
Segmento
QUANDO AS EXTENSÕES SÃO ALOCADAS
◊ Quando um segmento é criado, o espaço inicial é alocado (INITIAL EXTENT). Apesar de 
nenhuma linha ter sido incluída no segmento, aquela área (INITIAL) já está reservada 
para ele.
◊ Quando o segmento cresce, há necessidade de alocarmos mais espaço para ele (NEXT 
EXTENT). Esta operação é automatica e realizada com o banco de dados em atividade. 
Com a finalidade de manutenção, o bloco HEADER de cada segmento contém um 
diretório das extensões alocadas para aquele segmento.
◊ A tabela ou cluster é alterada para alocar extensões.
OBS: 
◊Os segmentos de ROLLBACK possuem pelo menos duas extensões.
◊As informações que estudaremos neste capítulo consideram o uso de operações seriais no 
qual um processo servidor efetua parse e execute de um comando de SQL. As extensões 
são alocadas de forma diferente para comandos que são executados em paralelo.
QUANDO AS EXTENSÕES SÃO LIBERADAS
Em geral as extensões de um segmento não retornar para o TABLESPACE até que façamos a 
remoção do segmento (por exemplo DROP TABLE...). Existem, no entanto, outras situações em 
que isto é possível. A lista de possibildiades é a seguinte:
◊ O segmento ou cluster é removido (drop).
◊ Quando executamos um comando TRUNCATE....DROP STORAGE estamos liberando 
as extensões para o ambiente.
◊ O segmento é maior que o necessário (optimal) e contém extensões livres (somente 
para segmentos de rollback). Esta ação é realizada, automaticamente, pelo ORACLE.
◊ O DBA pode liberar extensões não usadas usando o comando ALTER TABLE xxx 
DEALLOCATE UNUSED.
Quando extensões são liberadas o ORACLE modifica o BITMAO no DATAFILE (para LOCALLY 
MANAGED TABLESPACES) ou atualiza o dicionário de dados (para DICTIONARY MANAGED 
TABLESPACES) a fim de refletir a situação atual. Qualquer dado em bloco pertencente à 
extensão liberada torna-se inacessível. O ORACLE “limpará” este dado quando o bloco for 
realocado e reutilizado.
CONSIDERAÇÕES SOBRE EXTENSÕES
EXTENSÕES EM TABELAS NÃO CLUSTERED
Para esta forma de alocação a extensão associada a uma tabela pertence a ela até que 
venhamos a remover ou truncar a tabela. Mesmo que a extensão fique totalmente sem uso (em 
funções de exclusões , por exemplo), o espaço não é retornado para o tablespace.
Se removermos a tabela (DROP), o espaço anteriormente reservado para ela pode ser 
requisitado por outra extensão que necessite de espaço livre. 
Em tablespaces gerenciados através do dicionário de dados, quando um segmento necessita 
de uma extensão maior que aquelas disponíveis, o Oracle identifica (na tabela do dicionário de 
dados correpondente) e combina extensões contínuas para formar uma extensão mais. Esta 
operação chama-se COALESCE.
Para tablespaces gerenciados localmente, esta operação não é necessária uma vez que isto já 
é realizado automaticamente pelo BITMAP.
EXTENSÕES EM TABELAS CLUSTERED
Tabelas armazenadas em CLUSTERs armazenam suas informações em segmentos de dados 
do CLUSTER. Assim, se removermos uma tabela de um CLUSTER, o segmento de dados 
permanece reservado para o CLUSTER. Como alternativa podemo TRUNCAR um CLUSTER 
(exceto HASH) para liberarmos extensões.
EXTENSÕES EMVIEWS MATERIALIZADAS E SEUS LOGS
O ORACLE libera as estensões das views materializadas e de seus logs (chamados de 
snapshots e snapshot logs em ambientes distribuídos) da mesma maneira que para tabelas e 
clusters.
EXTENSÕES EM ÍNDICES
Todas as extensões alocadas para um índice permanecem associadas a ele enquanto o mesmo 
existir. Somente quando remover o índice ou a tabela ao qual este está associado, as 
extensões reservadas para ele são retornadas ao TABLESPACES.
EXTENSÕES EM SEGMENTOS DE ROLLBACK
O ORACLE, preiodicamente, verifica se os segmentos de rollback do banco de dados estão 
com crescimento acima do tamanho estipulado pelo parâmetro OPTIMAL. Se isto ocorrer, o 
ORACLE, automaticamente, libera as extensões acima deste tamanho.
EXTENSÕES EM SEGMENTOS TEMPORÁRIOS
Quando o ORACLE termina a execução do comando que precisou de segmento temporário, 
ele, automaticamente, remove o segmento e retorna o espaço para o tablespace associado.
Uma única operação de SORT reserva segmento temporário no tablespace temporário do 
usuário e, ao término, retorna esta área para o tablespace. 
No entanto, múltiplas operações de ordenação podem usar área em tablespaces temporários 
reservados exclusivamente para SORTs. Estes segmentos são alocados uma única vez para a 
instância e não são retornados após a operação ter sido concluída.
Um segmento temporário em uma tabela temporária é liberado ao fim da transação ou da 
sessão, retornando a extensão alocada para o tablespace correspondente.
A CLÁUSULA STORAGE
O controle da alocação de extensões para segmentos pode ser feito com o uso de parâmetros 
atribuídos individualmente aos objetos ou atribuídos como defaults para o tablespace.
A cláusula STORAGE é aplicável a todos os tipos de segmentos. Ela controla como o ORACLE 
reserva espaço para um determinado segmento.
Os objetos que reservam espaço em disco são: clusters, índices, segmentos de rollback, views 
materializadas ou snapshots, logs de views materializadas ou snapshots, tabelas, tablespaces e 
partições.
Quando criamos um tablespace podemos especificar valores para os parâmetros da cláusula 
STORAGE. Estes valores funcionam como um default para os segmentos alocados no 
TABLESPACE. Quando modificamos o TABLESPACE (usando o comando ALTER), podemos 
alterar o valor dos parâmetros estabelecidos, anteriormente, para a cláusula STORAGE, no 
entanto, isto somente afetará alocações subseqüentes.
OBS: a cláusula STORAGE é interpretada de forma diferenciada para TABLESPACES 
gerenciados localmente.
Quando criamos um objeto também podemos determinar uma cláusula STORAGE definindo 
valores específicos para a alocação de espaço para aquele objeto. No caso de omissão, fica 
valendo o default especificado para o TABLESPACE.
Parâmetros da Cláusula STORAGE A que objetos se aplicam
◊ INITIAL
◊ NEXT
◊ MAXEXTENTS
◊ MINEXTENTS
◊ PCTINCREASE
◊ OPTIMAL
◊ FREELISTS
◊ FREELIST GROUPS
◊ BUFFER POOL
◊ TABLE
◊ CLUSTER
◊ INDEX
◊ ROLLBACK SEGMENT
◊ TABLESPACE
◊ MATERIALIZED VIEW / SNAPSHOT
◊ MATERIALIZED VIEW LOG / SNAPSHOT LOG
◊ PARTITION
OBSERVAÇÕES SOBRE ALOCAÇÃO
◊ O espaço é alocado quando um objeto é criado e, posteriormente, quando ele cresce.
◊ O espaço é alocado em conjuntos de blocos contíguos chamados de extensões.
◊ Um objeto do banco de dados é armazenado dentro de um único tablespace pelo tempo 
de vida do objeto.
◊ Um tablespace está contido em arquivos de dados.
REGRAS DE PRECEDÊNCIA
◊ Qualquer parâmetro especificado ao nível de objeto se sobrepõe à opção 
correspondente atribuída ao nível de tablespace.
◊ Quando os parâmetros de armazenamento não são explicitamente atribuídos ao nível de 
objeto, o valor utilizado para eles é aquele especificado ao nível de tablespace.
◊ Quando os parâmetros de armazenamento não são explicitamente atribuídos ao nível de 
tablespace, o ORACLE aplica os valores defaults do sistema.
◊ Se os parâmetros de armazenamento forem alterados, as novas opções se aplicam 
somente a extensões ainda não alocadas.
◊ O parâmetro OPTIMAL só é especificado para segmentos de rollback.
◊ Os parâmetros FREELISTS e FREELIST GROUPS não podem ser especificados como 
defaults para tablespaces.
SIGNIFICADO DOS PARÂMETROS
◊INITIAL – Tamanho em BYTES da primeira extensão alocada para o segmento. O valor 
default é o equivalente a 5 blocos de dados. Podemos usar as letras K ou M para especificar 
Kbytes ou Mbytes. 
O mínimo é de 2 blocos para segmentos não BITMAP e 3 blocos para segmentos de 
BITMAPS adicionado de um para cada FREE LIST que viermos a especificar. O valor 
máximo depende do sistema operacional. 
O ORACLE arredonda os valores para um número inteiro de blocos para tamanhos de 
INITIAL inferiores a 5 blocos de dados e arredonda para valores múltiplos de 5 blocos de 
dados para tamanhos de INITIAL superiores a 5 blocos de dados.
OBS : Não podemos especifica INITIAL para o comando ALTER.
◊NEXT – Tamanho em bytes das próximas extensões alocadas para o segmento. O valor 
default é o equivalente a 5 blocos de dados. Podemos usar as letras K ou M para especificar 
Kbytes ou Mbytes.
O valor default é de 5 blocos. O tamanho mínimo é de um bloco de dados. O tamanho 
máximo depende do sistema operacional.
O ORACLE arredonda o tamanho para o próximo múltiplo de bloco para valores menores 
que 5 blocos de dados e arredonda um valor que minimize a fragmentação para tamanhos 
maiores que 5 blocos de dados.
Se modificarmos o valor do parâmetro NEXT (em um comando ALTER), a próxima extensão 
alocada terá este valor, independentemente do valor da última extensão alocada e de 
PCTINCREASE.
◊PCTINCREASE – Percentual que cada extensão cresce em relação à última extensão 
alocada (a partir da terceira). O valor default é 50%, o que significa que a próxima extensão 
terá valor 50% maior que a precedente. O valor mínimo para este parâmetro é 0, indicando 
que todas as extensões terão o mesmo tamanho.
O ORACLE arredonda o valor calculado para que a próxima extensão seja múltipla do 
tamanho de bloco.
Se modificarmos o valor deste parâmetro (em um comando ALTER), o ORACLE calcula o 
tamanho da próxima extensão baseado neste valor e no valor da última extensão alocada.
Podemos impedir o processo SMON de efetuar a operação de COALESCE quando 
preenchemos este valor com zero. A ORACLE CORPORATION recomenda o uso de zero 
neste parâmetro como uma forma de minimizarmos a fragmentação e impedirmos a 
possibilidade de gerarmos segmentos temporários grandes durante o processamento.
OBS: Segmentos de rollback não usam este parâmetro. O valor é sempre zero.
◊MINEXTENTS – Número total de extensões a serem alocadas quando o segmento é criado. 
O valor default e mínimo é 1 , sendo que para segmentos de rollback o mínimo é 2. O valor 
máximo depende do sistema operacional.
Este parâmetro permite a alocação de uma grande quantidade de espaço quando criarmos 
um objeto, mesmo se o espaço disponível não for contínuo.
Se o valor deste parâmetro for maior que 1, o Oracle calcula o tamanho das extensões 
subseqüentes baseado no valor dos parâmetros INITIAL, NEXT e PCTINCREASE.
OBS: Não podemos especificar este parâmetro no comando ALTER.
◊MAXEXTENTS - Número total de extensões que podem ser alocadas para o segmento, 
incluindo a INITIAL. O máximo depende do tamanho do bloco do ORACLE. O valor mínimo é 
1 (exceto para segmentos de ROLLBACK, que possui um mínimo de 2). O valor default 
depende do tamanho do bloco em uso.
Se usarmos a palavra chave UNLIMITED estaremos indicando que extensões devem ser 
alocadas, automaticamente, sempre que necessário. A ORACLE CORPORATION 
recomenda a utilização desta opção como uma forma de minimizar fragmentação.
Não devemos, no entanto, utilizar esta palavra chave em segmentos de ROLLBACK, uma 
vez que transações muito longas contendo INSERTS, UPDATES ouDELETES que 
prossigam por um longo tempo continuarão a criar novas extensões até o disco ficar cheio.
OBS: Para um segmento de ROLLBACK criado sem a especificação da cláusula STORAGE, 
os parâmetros referentes a armazenamento serão herdados do TABLESPACE. Assim, se 
tivermos criado o TABLESPACE com a indicação do número máximo de extensões ilimitado, 
o segmento de ROLLBACK terá o mesmo default.
◊OPTIMAL - Especifica um tamanho ótimo em bytes para segmentos de ROLLBACK. 
Podemos usar as letras K ou M para indicar Kbytes ou Mbytes. O ORACLE tenta manter este 
tamanho através da liberação de área quando seus dados não são mais necessários para as 
transações ativas.
O Oracle libera tantas extensões quantas forem necessárias para que o segmento de 
ROLLBACK retorne ao valor de OPTIMAL especificado.
Se especificarmos NULL para um segmento de ROLLBACK, indicamos que o ORACLE 
NUNCA deverá liberar as extensões alocadas. Este é o valor default.
O valor de OPTIMAL não pode ser menor que o espaço alocado inicialmente para o 
segmentomento de ROLLBACK especificado pelos parâmetros MINEXTENTS, INITIAL, 
NEXT e PCTINCREASE. O tamanho máximo depende do sistema operacional.
O ORACLE arredonda o valor para o próximo múltiplo de bloco.
◊FREELISTS – Número de listas de blocos livres para controle de inserções em um objeto 
diferente de tablespace. O valor default e mínimo é 1, indicando que cada FREE LIST 
GROUP contém uma FREE LIST. O valor máximo depende do tamanho do bloco de dados. 
Se especificarmos um valor muito grande, receberemos do ORACLE um erro indicativo.
OBS: Somente podemos especificar este parâmetro em comandos CREATE TABLE, 
CREATE CLUSTER e CREATE INDEX.
◊FREELIST GROUPS – Número de grupos de FREE LISTS para uma tabela partição, cluster 
ou índice. O valor default e mínimo é 1.
Somente devemos usar este parâmetro se estivermos usando o ORACLE com a opção 
PARALLEL SERVER.
O ORACLE usa um bloco de dados para cada FREE LIST GROUP. Se não tivermos 
especificado um tamanho grande o suficiente para o parâmetro INITIAL, de tal forma que 
caiba o mínimo (de blocos) mais 1 bloco para cada grupo, o ORACLE incrementa o valor do 
INITIAL com a quantidade necessária de blocos.
◊BUFFER POOL – determina um valor default para a área de memória (buffer pool – cache) 
para o objeto. Todos os blocos do objeto são armazenados neste BUFFER POOL.
Se tivermos definido um BUFFER POOL para uma tabela ou índice particionado, as 
partições herdarão esta definição da tabela ou índice (podemos, no entanto, determinar 
valores específicos a nível de partição).
OBS: Este parâmetro não é válido para TABLESPACES e segmentos de ROLLBACK.
Os valores válidos são:
o KEEP – retém o objeto em memória para impedir operações de I/O.
o RECYCLE – retira os blocos da memória tão logo eles não sejam mais necessários, 
a fim de que um objeto permaneça no CACHE desnecessariamente.
o DEFAULT – sempre existe para objetos não associados a KEEP ou RECYCLE.
CONSIDERAÇÕES SOBRE EXTENSÕES GERENCIADAS LOCALMENTE
Um tablespace que gerencia suas extensões localmente pode ter tanto tamanho das extensões 
uniformes quanto variáveis. Quando criamos o TABLESPACE indicamos, através das opções 
UNIFORM ou AUTOALLOCATE como será a alocação.
Para extensões gerenciadas pelo sistema (AUTOALLOCATE) podemos especificar o tamanho 
da extensão inicial e o ORACLE determina o tamanho ideal para as extensões adicionais, com 
um tamanho mínimo de 64K. Este é o default para tablespaces permanentes.
Para extensões alocadas uniformemente (UNIFORM), podemos especificar um tamanho de 
extensão (ou usar 1M). Tablespaces temporários que gerenciam suas extensões localmente 
somente podem se utilizar deste tipo de alocação.
Os parâmetros NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS e DEFAULT STORAGE 
não são válidos para extensões que são gerenciadas localmente.
CONSIDERAÇÕES SOBRE EXTENSÕES GERENCIADAS PELO DICIONARIO DE DADOS
Um tablespace que utilize o dicionário de dados para gerenciamento de suas extensões possui 
tamanhos crescentes para estas, determinados pelos parâmetros INITIAL, NEXT e 
PCTINCREASE.
Quando criamos um objeto neste tablespace sua primeira extensão tem o tamanho INITIAL. 
Quando algum espaço adicional é necessário os parâmetros NEXT e PCTINCREASE são 
usados.
EXEMPLO
No exemplo a seguir criamos uma tabela e determinamos valores para os parâmetros de 
armazenamento.
COMENTÁRIOS:
◊O valor do parâmetro MINEXTENTS é 1, sendo assim, apenas uma extensão será 
reservada para a tabela a tempo de criação.
◊O tamanho desta extensão inicial é de 100K.
◊Se a tabela crescer, o Oracle alocará uma segunda extensão com o tamanho de 50K.
◊Se os dados da tabela crescerem a ponto da segunda extensão ser totalmente preenchida, 
o Oracle aloca uma terceira extensão. Como o valor de PCTINCREASE default é 50%, a 
terceira extensão terá comprimento 50 + 25 = 75 Kbytes. Se considerarmos que o tamanho 
do bloco Oracle seja 2K, seu tamanho será de 76Kbytes.
◊Como o valor de MAXEXTENTS é 50, no máximo 50 extensões poderão ser alocadas para 
a tabela
SQL> CREATE TABLE teste
 2 (codigo NUMBER(2),
 3 nome VARCHAR2(14),
 4 sobrenome VARCHAR2(13)
 5 )
 6 STORAGE (INITIAL 100K
 7 NEXT 50K
 8 MINEXTENTS 1
 9 MAXEXTENTS 50
 10 )
 11 /
Tabela criada.
COMO AS EXTENSÕES SÃO ALOCADAS
O ORACLE usa diferentes algoritmos para a alocação de extensões, de acordo com o tipo de 
gerenciamento do TABLESPACE.
TABLESPACES GERENCIADOS LOCALMENTE
Para este tipo de tablespace, o Oracle verifica a área livre determinando um DATAFILE 
candidato e pesquisando no BITMAP do arquivo pelo número de blocos livres adjacentes. 
Se não houve espaço no DATAFILE escolhido, ele escolhe outro DATAFILE.
TABLESPACES GERENCIADOS PELO DICIONÁRIO DE DADOS
Neste tipo de tablespace a pesquisa por área livre é bem mais complexa.
1. O ORACLE pesquisa por área livre com o tamanho definido por NEXT usando o seguinte 
algoritmo:
◊O ORACLE pesquisa por um conjunto de blocos de dados contíguo que tenha o tamanho 
de NEXT mais um bloco a fim de reduzir a fragmentação interna (o tamanho é arredondado 
para o tamanho da extensão mínima para o tablespace, se necessário). Por exemplo se a 
nova extensão deve ter o tamano de 19 blocos de dados, o ORACLE procura por um espaço 
do tamanho de 20 blocos de dados contíguos. Se a nova extensão possui 5 blocos ou 
menos, o ORACLE não adicionar o bloco extra.
◊Se não for encontrada uma área com o tamanho necessário, ele pesquisa por uma área 
contígua maior que a quantidade necessária. Se ele encontrar um grupo de blocos contíguos 
que tenha pelo menos o tamanho de 5 blocos a mais que o tamanho procurado, ele divide o 
conjunto e reserva a extensão com o tamanho definido. Se ele encontrar um grupo de bloco 
que tenha um tamanho maior que o necessário, porém com uma diferença inferior a 5 
blocos, ele aloca todos os blocos contíguos para a nova extensão.
◊Se ele não encontrar um conjunto de blocos contíguos maior ou igual ao tamanho definido, 
ele aciona o algoritmo de COALESCE e volta ao ponto inicial da pesquisa.
◊Se a extensão não puder ser alocada na segunda pesquisa, o ORACLE tenta redimensionar 
o DATAFILE se a opção de extensão (AUTOEXTEND) estiver autorizada. Caso isto não seja 
possível, ele retorna um erro.
2. Após a alocação da área o ORACLE atualiza o HEADER do segmento e o dicionário de 
dados para que reflitam a modificação ocorrida.
Os blocos da extensão recém alocada, apesar de estarem livres, podem não estar vazios dos 
dados anteriores. Normalmente, o ORACLE não formata os blocos desta nova extensão no 
momento da alocação, somente quando necessário. Em algumas situações, no entanto, esta 
ação é feita, como ocorre quando o DBA força a alocação usando a opção ALLOCATEEXTENT 
dos comandos ALTER TABLE ou ALTER CLUSTER.
OBTENDO INFORMAÇÕES
Ao pesquisarmos as views do dicionário de dados obteremos informações sobre as extensões 
alocadas e sobre a quantidade de segmentos existentes.
VIEWS DO DICIONÁRIO DE DADOS
◊ USER/DBA_EXTENTS
◊ USER/DBA_FREE_SPACE
◊ USER/DBA_SEGMENTS
◊ USER/DBA_TABLESPACES
◊ DBA_DATA_FILES
JUNTANDO O ESPAÇO DISPONÍVEL
O espaço tablespaces é gerenciado usando-se extensões, que são compostas de um número 
específico de blocos de dados contíguos. 
Se um grande número de extensões livres estiver fragmentado ou existirem vários pequenos 
espaços contíguos, o tablespace pode ser COALESCED. 
Isto é feito, por default, pelo System Monitor (SMON), mas também podemos acelerar o 
processo usando o comando de SQL ALTER TABLESPACE com a cláusula COALESCE.
Este comando não modifica fisicamente o tablespace, apenas sua definição, juntando na tabela 
DBA_FREE_SPACE a percepção de blocos contínuos mostrados como mais de um registro.
SQL> ALTER TABLESPACE users COALESCE;
Espaço de tabela alterado.
Para obtermos informações sobre extensões COALESCEABLE para um tablespace, podemos 
consultar a view DBA_FREE_SPACE_COALESCED.
SQL> desc DBA_FREE_SPACE_COALESCED
 Name Null? Type
 ------------------------------- -------- ----
 TABLESPACE_NAME VARCHAR2(30)
 TOTAL_EXTENTS NUMBER
 EXTENTS_COALESCED NUMBER
 PERCENT_EXTENTS_COALESCED NUMBER
 TOTAL_BYTES NUMBER
 BYTES_COALESCED NUMBER
 TOTAL_BLOCKS NUMBER
 BLOCKS_COALESCED NUMBER
 PERCENT_BLOCKS_COALESCED NUMBER
SEGMENTOS
Um segmento é um conjunto de extensões que contém todos os dados para um determinado 
tipo de estrutura lógica dentro do tablespace.
O ORACLE usa os seguintes tipos de segmentos:
◊CACHE ou BOOTSTRAP - Uma extensão que contém definições do dicionário para as 
tabelas do dicionário a serem carregadas quando o banco de dados está aberto. Não requer 
atenção especial por parte do administrador.
◊CLUSTER - Uma coleção de extensões que acomoda todos os dados de um cluster.
◊INDEX - Uma coleção de extensões que acomoda todos os dados para um índice 
específico.
◊LOBINDEX - Uma coleção de extensões que acomoda todos os dados para um índice de 
um LOB (large object).
◊LOBSEGMENT - Uma coleção de extensões que acomoda todos os dados de um LOB 
armazenado fora da linha de sua tabela origem.
◊NESTED TABLE - Uma coleção de extensões que acomoda todos os dados de uma tabela 
do tipo NESTED.
◊ROLLBACK - Uma coleção de extensões que acomoda dados de rollback para operações 
de rolback, read-consistency ou recovery.
◊TABLE - Uma coleção de extensões que acomoda todos os dados de uma tabela.
◊TABLE PARTITION - Uma coleção de extensões que acomoda todos os dados de uma 
determinada extensão da tabela.
◊TEMPORARY SEGMENT - Uma coleção de extensões que acomoda dados pertencentes a 
tabelas temporárias criadas durante operações de ordenação.
CARACTERÍSTICAS
◊Um segmento é uma estrutura lógica que pode ser criada, ocupa espaço físico e pode 
crescer. Segmentos são freqüentemente chamados de Database Objects.
◊Segmentos estão contidos em tablespaces.
◊Uma extensão é um conjunto de blocos de dados contíguos.
◊Os parâmetros de armazenamento para segmentos temporários sempre usam os valores 
default especificados para os tablespaces correspondentes. Eles não podem ser atribuídos 
explicitamente.
SEGMENTOS DE DADOS
Os segmentos de dados (data segments) contêm os dados que foram incluídos em: 
◊Tabelas
◊Partições de tabelas particionadas
◊Tabelas armazenadas em clusters
◊Tabelas do tipo NESTED
O ORACLE cria estes segmentos de dados quando criamos a tabela ou cluster com o comando 
CREATE.
Os parâmetros da cláusula STORAGE para uma tabela ou CLUSTER determinam como as 
extensões dos segmentos de dados são alocadas. Podemos especificar estes parâmetros, 
diretamente, com o comando CREATE ou ALTER correspondente.
OBS:
◊ Clusters definem uma estrutura de armazenamento.
◊ Cada cluster contém uma ou mais definições de tabelas.
◊ Hash clusters podem conter mais de uma tabela, mas é raro.
◊ Tabelas em um cluster são usadas (consultadas, atualizadas, etc) por um usuário como 
se fossem tabelas isoladas.
SEGMENTOS DE ÍNDICES
Segmentos de índices contém os índices criados para aumento de performance na recuperação 
dos dados.
Cada índice não particionado no banco de dados possui um único segmento de índice para 
acomodar todos os seus dados. Para um índice particionado, cada partição possui seu próprio 
segmento de índice.
O ORACLE cria um segmento de índice para um índice ou partição quando executamos o 
comando CREATE INDEX. Neste comando podemos especificar os parâmetros de 
armazenamento para as extensões do segmento e o tablespace no qual o índice é criado.
Para o índice de um LOB, a especificação das características físicas é feita com o uso da 
cláusula LOB na criação da tabela.
O SEGMENTO DE ROLLBACK
Um segmento de ROLLBACK é uma porção do banco de dados que registra as imagens dos 
dados antes da modificação pela transação, permitindo que as alterações sejam desmanchadas 
(ou desfeitas) sob certas circunstâncias.
Uma transação é uma unidade de trabalho que causa modificações sobre o banco de dados. A 
cada transação é dado um único identificador e associado um e somente um segmento de 
ROLLBACK.
Um segmento de ROLLBACK é um objeto circular em que cada transação pode ter várias 
entradas. 
CARACTERÍSTICAS
◊ Permite que as modificações feitas por uma transação sejam totalmente ou parcialmente 
(SAVEPOINT) desfeitas em caso de erro de operação.
◊ Provê o mecanismo de READ CONSISTENCY.
◊ São necessários para a recuperação do banco de dados em caso de catástrofe 
(DATABASE RECOVERY).
◊ Podem registrar modificações (sobre dados) feitas em qualquer tablespace, com 
exceção do segmento de rollback SYSTEM.
◊ Pode registrar alterações para diversas transações.
◊ Deve existir um segmento de rollback chamado SYSTEM no tablespace SYSTEM.
◊ É necessário pelo menos um segmento de ROLLBACK extra se diversos tablespaces 
forem usados.
SEGMENTOS TEMPORÁRIOS
Os segmentos temporários têm a finalidade de reservar espaço para operações de ordenação 
(sort).
O ORACLE não cria um segmento se a operação de ordenação puder ser feita em memória ou 
se encontrar alguma outra forma de obter o mesmo resultado usando índices.
As seguintes operações podem precisar de segmentos temporários:
◊CREATE INDEX
◊SELECT ... ORDER BY 
◊SELECT DISTINCT ... 
◊SELECT ... GROUP BY 
◊SELECT ... UNION 
◊SELECT ... INTERSECT 
◊SELECT ... MINUS 
Algumas operações de JOIN e subqueries correlacionadas podem também requerer o uso de 
um segmento temporário.
Se as aplicações freqüentemente executam comandos apresentados anteriormente, o DBA 
pode desejar incrementar a performance ajustando o parâmetro de inicialização 
SORT_AREA_SIZE.
Um outro motivo para a alocação de segmento temporário é a criação de tabelas e índices 
temporários. Como estas tabelas armazenam dados somente durante a transação ou sessão, o 
ORACLE aloca estes dados em segmentos temporários.
O ORACLE aloca segmentos temporários de forma diferente para QUERIES e tabelas 
temporárias:
◊PARA QUERIES – o ORACLE aloca os segmentos temporários, quando há necessidade, 
no tablespace temporário do usuário que estiver executando o comando. Se nenhum 
tablespace temporário tiver sido definido para o usuário, o tablespace temporário default é o 
tablespace SYSTEM. As características de armazenamento defaults estabelecidas para o 
tablespace determinarão como ocorrerá a alocação de área.
O ORACLE remove os segmentos temporários quando o comando termina.
Em função desta freqüente alocaçãoe liberação de área, pode ser conveniente a criação de 
um tablespace especial para segmentos temporários. Com isto podemos distribuir as 
operações de I/O pelos discos disponíveis e, ainda, evitar a fragmentação do tablespace 
SYSTEM.
As modificações em segmentos temporários não são registradas log, excetuando-se as 
operações de gerenciamento de espaço.
◊PARA TABELAS E ÍNDICES TEMPORÁRIOS – o ORACLE aloca os segmentos 
temporários quando o primeiro comando INSERT(ou CREATE TABLE AS SELECT) é 
executado na tabela. Este primeiro INSERT aloca os segmentos para a tabela, seus índices, 
cria a página raiz (ROOT) para os índices e aloca qualquer segmento LOB.
◊São alocados no tablespaec temporário do usuário que tiver criado a tabela.
◊O ORACLE remove o segmento ao término da transação ou sessão (de acordo com o tipo 
da tabela temporária).
◊Se outras transações ou sessões compartilharemo o uso daquela tabela temporária, so 
segmentos contendo seus dados permanecem associados à tabela.
OBS:
◊ Todos os tablespaces podem conter segmentos temporários.
◊ A alocação do espaço é determinada pelo parâmetro DEFAULT STORAGE do 
tablespace.
◊ A extensão dinâmica de áreas temporárias pode causar fragmentação.
◊ O DBA pode definir que tablespace cada usuário pode usar para segmento temporário 
(parâmetro do comando CREATE/ALTER USER), desta forma é possível dedicarmos um 
tablespace para segmentos temporários.
SEGMENTO BOOTSTRAP
O segmento BOOTSTRAP contém tabelas do dicionário de dados a serem carregadas quando 
o banco de dados é aberto.
◊ Também pode ser referenciado como CACHE segment.
◊ Não pode ser lido, modificado ou removido. Inacessível a usuários.
◊ Reside no tablespace SYSTEM e pertence ao usuário SYS.
◊ Não requer nenhuma ação por parte do DBA.
◊ Normalmente utiliza menos de 50 blocos ORACLE.
LIBERANDO ESPAÇO DISPONÍVEL
Não é incomum alocarmos espaço para um segmento e posteriormente verificarmos que este 
espaço não está sendo usado. Assim, é possível que desejemos liberar espaço não usado para 
que outros segmentos possam fazer uso desta área.
◊ Dentro de um segmento existe uma marca d'água (high water mark) que separa a parte 
de espaço usado da parte não usada.
◊ Se excluirmos linhas de uma tabela, a marca d'água não é movida.
◊ A marca d'água pode ser encontrada usando a procedure UNUSED_SPACE do pacote 
DBMS_SPACE.
◊ Se um segmento estiver completamente vazio, o espaço pode ser liberado usando-se o 
comando de SQL TRUNCATE DROP STORAGE.
O PACKAGE DBMS_SPACE
Este package é composto de procedures relativas a utilização de espaço em objetos do banco 
de dados:
◊ UNUSED_SPACE - determina o espaço sem uso em um objeto (table, index, cluster).
DBMS_SPACE.UNUSED_SPACE (
 segment_owner IN VARCHAR2, 
 segment_name IN VARCHAR2,
 segment_type IN VARCHAR2,
 total_blocks OUT NUMBER,
 total_bytes OUT NUMBER,
 unused_blocks OUT NUMBER,
 unused_bytes OUT NUMBER,
 last_used_extent_file_id OUT NUMBER,
 last_used_extent_block_id OUT NUMBER,
 last_used_block OUT NUMBER, 
 partition_name IN VARCHAR2 DEFAULT NULL);
◊ FREE_BLOCKS - fornece informações sobre blocos livres em um objeto (table, index, 
cluster).
DBMS_SPACE.FREE_BLOCKS (
 segment_owner IN VARCHAR2, 
 segment_name IN VARCHAR2,
 segment_type IN VARCHAR2,
 freelist_group_id IN NUMBER,
 free_blks OUT NUMBER,
 scan_limit IN NUMBER DEFAULT NULL,
 partition_name IN VARCHAR2 DEFAULT NULL);
EXEMPLO
SQL> VARIABLE MSG VARCHAR2(1000)
SQL> SET AUTOPRINT ON
SQL> DECLARE
 2 total_blocks NUMBER;
 3 total_bytes NUMBER;
 4 unused_blocks NUMBER;
 5 unused_bytes NUMBER;
 6 last_used_extent_file_id NUMBER;
 7 last_used_extent_block_id NUMBER;
 8 last_used_block NUMBER;
 9 BEGIN
 10 DBMS_SPACE.UNUSED_SPACE (
 11 'ALUNO', -- segment_owner
 12 'FUNC', -- segment_name
 13 'TABLE', -- segment_type
 14 total_blocks,
 15 total_bytes,
 16 unused_blocks,
 17 unused_bytes,
 18 last_used_extent_file_id,
 19 last_used_extent_block_id,
 20 last_used_block,
 21 NULL); -- partition_name
 22 :MSG := 'total_blocks = '||total_blocks||chr(10)||
 23 'total_bytes = '||total_bytes||chr(10)||
 24 'unused_blocks = '||unused_blocks||chr(10)||
 25 'unused_bytes = '||unused_bytes||chr(10)||
 26 'last_used_extent_file_id = '||
 27 last_used_extent_file_id||chr(10)||
 28 'last_used_extent_block_id = '||
 29 last_used_extent_block_id||chr(10)||
 30 'last_used_block = '||last_used_block||chr(10);
 31 END;
 32 /
Procedimento PL/SQL concluído com sucesso.
MSG
-------------------------------------------------------------------
total_blocks = 4
total_bytes = 8192
unused_blocks = 0
unused_bytes = 0
last_used_extent_file_id = 2
last_used_extent_block_id = 823
last_used_block = 2
A OPÇÃO DEALLOCATE UNUSED
Podemos usar o comando ALTER TABLE para liberar espaço não usado. 
A opção DEALLOCATE UNUSED libera espaço ao final de uma tabela, partição ou subpartiçao, 
segmento de overflow, segmento de LOB ou LOB index e o disponibiliza para outros segmentos 
no tablespace.
Somente podemos liberar espaço acima da marca d’água (porção do objeto nunca utilizada, os 
blocos de dados ainda não foram formatados para recebe dados).
A marca d'água não se modifica quando disponibilizamos espaço.
◊ Se não desejarmos liberar todos os espaços não usados, devemos usar a cláusula 
KEEP.
◊ Devemos verificar se o espaço disponível foi liberado através da view 
DBA_FREE_SPACE (colunas EXTENT_ID, FILE_ID e BLOCK_ID).
◊ ALTER TABLE XXX DEALLOCATE UNUSED - Se minextents for 1, o resultado será a 
reserva de 2 extensões com 10K cada. Se minextents for 2, o resultado é o mesmo 
anterior, mas se minextents é 3, nada é liberado.
◊ ALTER TABLE XXX DEALLOCATE UNUSED KEEP 10K - Neste caso serão 
preservados 10K acima da marca d'água. O resultado será composto de 2 extensões, 
sendo a primeira de 10K e a segunda de 20K. Se minextents for 3, este comando 
causará a modificação do minextents para 2.
EXT1
10K
EXT2
20K
EXT3
30K
40K = Unused Space
REGRAS: 
◊Se omitirmos KEEP e a marca d’água estiver acima do tamanho de INITIAL e 
MINEXTENTS, então todo o espaço não usado acima da marca d’água é liberado. Quando a 
marca d’água é menor que o tamanho de INITIAL ou MINEXTENTS, então todo o espaço 
não usado acima de MINEXTENTS é liberado.
◊Se especificarmos KEEP, então a quantidade especifica de espaço é mantida e o restante é 
liberado. Quando o número restante de extensões é menor que MINEXTENTS, então 
MINEXTENTS é ajustado para o número de extensões real após a liberação. Se a extensão 
inicial torna-se menor que INITIAL, o valor de INITIAL é ajustado para o novo tamanho.
◊Em ambos os casos, o valor de NEXT é preenchido com o tamanho da última extensão que 
foi liberada.

Mais conteúdos dessa disciplina