Describe the storage of table row data in blocks

Como parte do paradigma do modelo relacional, deve existir uma separação, ou abstração, do armazenamento físico do lógico. A peça chave para fazer essa abstração é o tablespace.

O programador pode até conhecer o tablespace onde esta armazenado o segmento(objeto que armazena dados em um tablespace, veremos quais existe mais pra frente), seja uma tabela ou índice. Mas ele não precisa saber qual datafile compõe o tablespace, quantos são, qual a configuração deles, onde estão salvos, em file disk, asm, qual o diretório, em qual sistema operacional e etc. Esses dafiles que compõe o tablespace pode ser movidos, renomeados, sem que o usuário sequer perceba essas mudanças. Essa é a completa abstração que o Oracle provê.

Mas, vamos entender como os dados, cada linha, é armazenada. Sabemos que ao criar uma tabela(segmento), ela será armazenada em um tablespace. Um tablespace pode ter um ou mais datafiles, que é os arquivos físicos no servidor ou storage. Cada segmento é armazenado associando extents a eles. Extents é um conjunto em sequencia de Oracle blocks, Oracle Block é a menor unidade de armazenamento do Oracle. Geralmente medindo 8kb, escolhido durante a criação do database, mas podendo escolher um tamanho diferente para um novo tablespace. Esse Oracle block é formado pelos blocks do sistema operacional. Eles não precisam ser do mesmo tamanho, mas a recomendação é que o block do sistema operacional não seja maior que o tamanho do Oracle block. A imagem abaixo mostra o relacionamento entre o tablespace até o block do sistema operacional. Depois temos o relacionamento entre os Oracle blocks e os blocks do sistema operacional.

Uma linha é armazenada nos Oracle blocks. Ela pode até ser menor que um único block de 8kb, mas o Oracle irá ler e escrever sempre um block inteiro, mesmo que a área de interesse seja bem menor.

Então, resumindo. Um segmento é composto por um ou mais extents, esses extents são numerados consecutivamente. E os extents por sua vez é um conjunto consecutivos de Oracle blocks. Os extents podem ser identificados pela dimensão do segmento, que são numerados sequenciamentos por cada segmento. Ou então podem ser identificados a nível, ou dimensão, do datafile, em que cada extent em um datafile, começa em um certo número de Oracle block. Toda essa estrutura pode ser vista na imagem abaixo.

Vamos ver um exemplo agora, de um segmento, com os seus extents.

$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Jul 1 09:45:30 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> CREATE TABLESPACE teste_tbs;

Tablespace created.

SQL> CREATE TABLE teste(a CHAR(2000)) TABLESPACE teste_tbs;

Table created.

SQL> SELECT sg.segment_name,
  2         sg.bytes,
  3         sg.blocks,
  4         sg.extent_id,
  5         sg.block_id,
  6         sg.file_id
  7  FROM   dba_extents sg
  8  WHERE  segment_name = 'TESTE';

SEGMENT_NAME
--------------------------------------------------------------------------------
     BYTES     BLOCKS  EXTENT_ID   BLOCK_ID    FILE_ID
---------- ---------- ---------- ---------- ----------
TESTE
     65536          8          0        128          6


SQL>

Perceba que ao criar uma tabela, já foi criado um extent para a mesma, com extent_id 0. Quantidade de blocks foi 8, tamanho em bytes é de 65536, isso por que o tamanho do block do meu banco é de 8192(8kb). Esse extent esta no datafile com file_id 6, e por último o block_id, que nos informa aonde começa o primeiro bloco do nosso extext, o número inicial do block, no datafile informado.

Vamos adicionar agora alguns dados para ir aumentando o tamanho da nossa tabela, e consequentemente o Oracle irá adicionar mais extents.

SQL> INSERT INTO teste
  2  SELECT 'A'
  3  FROM dual
  4  CONNECT BY LEVEL <= 50;

50 rows created.

SQL> COMMIT;

Commit complete.

SQL> SELECT sg.segment_name,
  2         sg.bytes,
  3         sg.blocks,
  4         sg.extent_id,
  5         sg.block_id,
  6         sg.file_id
  7  FROM   dba_extents sg
  8  WHERE  segment_name = 'TESTE';

SEGMENT_NAME
--------------------------------------------------------------------------------
     BYTES     BLOCKS  EXTENT_ID   BLOCK_ID    FILE_ID
---------- ---------- ---------- ---------- ----------
TESTE
     65536          8          0        128          6

TESTE
     65536          8          1        136          6

TESTE
     65536          8          2        144          6


SEGMENT_NAME
--------------------------------------------------------------------------------
     BYTES     BLOCKS  EXTENT_ID   BLOCK_ID    FILE_ID
---------- ---------- ---------- ---------- ----------
TESTE
     65536          8          3        152          6

TESTE
     65536          8          4        160          6


SQL>

Veja que ao adicionar 50 linhas, com CHAR(2000), foram adicionados mais dois extents, veja que os block_id estão em sequencia, pois esse data file esta sendo usado somente por essa tabela, sem a interferência de outros segmentos. Um extent só pode estar em um datafile, mas um segmento pode ter vários extents em vários datafiles, que pertencem a um único tablespace.

Mais pra frente, iremos ver como o Oracle escolhe e armazena os dados em cada Oracle block.

Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: , , , , ,
Publicado em Administração, Certificação Oracle

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Esse Blog é reconhecido pela
Sou um
Certificações
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 142.605 Visualizações
%d blogueiros gostam disto: