Segments – Dúvida por email

A teoria é sempre necessária, nem que seja para saber o que estamos realmente a fazer na prática 🙂
Recebi um email de um anónimo brasileiro que perguntava o que realmente era na prática um segment.

Basicamente os segments (vou usar o termo em inglês) é do ponto de vista organizacional de um tablespace a maior unidade, ou seja, são simplesmente objectos (tabelas, indices, undo, etc) que consomem espaço em disco. Esta é a definição aceite. É aceite também que grande parte das vezes que se cria uma tabela é criado um “table segment”, cada vez que se cria um indice normalmente é criado um “index segment”, etc..
Todo e qualquer objecto que consuma espaço em disco é em última instância guardado num único segmento.
Um único segment pode conter extents de um ou mais ficheiros, no entanto cada extent pode conter apenas dados de um datafile.

Toda a terminologia criada e muito conhecida de qualquer DBA, undo segments, cluster segments, index segments, temporary segments segue esta lógica de principio.

No entanto,as coisas não são tão simples como parecem. Para definir coerentemente um segment é necessário definir (ainda que de forma simples) as outras unidades de armazenamento lógico do espaço.
A cadeia é simples:
1 – Datablocks (blocks, pages) – Número de bytes de espaço fisico no disco
2 – Extents – Os segments consistem em um ou mais extents. Representam a alocação continua de espaço num ficheiro.
3 – Segments – Conjunto de extends, alocado para uma estrutura de dados (tabelas, indices) residentes no mesmo tablespace.

A imagem seguinte representa a estrutura lógica hierarquica do Oracle para estes conceitos apresentados:

 

No entanto depois desta teoria toda, pode haver alguma confusão nesta questão de cada objecto é guardado em ultima instância num único segment, já que é possível que tenham visto um CREATE statements a criar multisegments.

À medida que a tecnologia avança, avança talvez a complexidade. Portanto existem actualmente objectos que são multi-segment:

– IOT’s com overflows
– Tabelas com LOBs
– Tabela particionadas

– etc(?)

Tomemos como exemplo o seguinte:

CREATE TABLE T(a int primary key, y clob)

Este statement criará 4 segments:
1º – Um segment para a tabela T
2º – Um segment para o indice na chave primária
3º – Um para LOB index
4º – Um para os dados do LOB em si.

Dado a sua natureza especifica os multi-segments podem pertencer a multiplos tablespaces diferentes, ou seja, a tabela T criará um “table segment” que poderá estar num tablespace diferente do que é usado para os LOBs.
Como sabem, é possível definir alguns parâmetros aquando do CREATE que influênciam a eficiência do dados e do espaço em disco.

Havia mais por dizer como os tipos de segments existentes por ex, mas penso que na essência está resumido o que é um segment/multi-segment.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s