.comment-link {margin-left:.6em;}

Thursday, May 12, 2005

Movendo LOBs de Tablespaces

O artigo de hoje é dedicado aos colegas de trabalho. É atividade de DBA, porém curtinho, os hit ratio virão em breve. Acabei de chegar do cinema, fui assistir Cruzada. Estou "cansadão" :)

Depois de fazer o dever de casa, ou seja, converter todos os campos LONG/LONG RAW em CLOB/BLOB, respectivamente, agora seria interessante mantê-los em tablespaces apropriadas, já que LOBs - Large OBjects - são datatypes que, geralmente, mantêm grande quantidade de dados. Quando o tamanho do campo LOB é maior que 4000 bytes, eles migram para seu próprio segmento, portanto, este segmento deveria estar em uma tablespace separada.

Para realizar esta tarefa o DBA poderia usar o
alter table t move lob(x) store as ( tablespace new_tablespace );
Vamos jogar com um exemplo:

ops$marcio@ORA10G> create tablespace tbs1;

Tablespace created.

ops$marcio@ORA10G> create tablespace tbs2;

Tablespace created.

ops$marcio@ORA10G>
ops$marcio@ORA10G> create table t ( y number, x clob ) tablespace tbs1;

Table created.

ops$marcio@ORA10G>
ops$marcio@ORA10G> col segment_name format a30
ops$marcio@ORA10G>
ops$marcio@ORA10G> select segment_name, tablespace_name
2 from dba_segments
3 where owner = user;

SEGMENT_NAME TABLESPACE_NAME
------------------------------ ------------------------------
T TBS1
SYS_LOB0000011688C00002$$ TBS1
SYS_IL0000011688C00002$$ TBS1

3 rows selected.

Acima, vimos que todos os segmentos pertencem a tablespace tbs1, porém queremos passar os lobs para a tablespace tbs2.

ops$marcio@ORA10G>
ops$marcio@ORA10G> alter table t move tablespace tbs2;

Table altered.

ops$marcio@ORA10G>
ops$marcio@ORA10G> select segment_name, tablespace_name
2 from dba_segments
3 where owner = user;

SEGMENT_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_LOB0000011688C00002$$ TBS1
SYS_IL0000011688C00002$$ TBS1
T TBS2

3 rows selected.

Note que somente o segmento TABLE foi movido, o LOGSEGMENT ficou da maneira que foi criado.

ops$marcio@ORA10G> alter table t move lob(x) store as ( tablespace tbs2 );

Table altered.

ops$marcio@ORA10G>
ops$marcio@ORA10G> select segment_name, tablespace_name
2 from dba_segments
3 where owner = user;

SEGMENT_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_IL0000011688C00002$$ TBS2
T TBS2
SYS_LOB0000011688C00002$$ TBS2

3 rows selected.

Agora sim, vemos todos os segmentos na tablespace correta.
Para acelerar o processo de mover os segmentos LOBSEGMENT de uma vez, podemos usar um select simples para gerar um script. Depois run it!
Para certificar que o select funciona somente para tabelas que possuam LOGSEGMENT, criei uma tabela a mais sem nenhum LOB.

ops$marcio@ORA10G> create table t1 ( n1 number ) tablespace tbs2;

Table created.

ops$marcio@ORA10G>
ops$marcio@ORA10G> select 'alter table ' || table_name || ' move lob(' ||
2 column_name || ') store as ( tablespace tbs2 );' texto
3 from dba_tab_columns
4 where data_type like '%LOB%'
5 and owner = user
6 /

TEXTO
----------------------------------------------------------------------
alter table T move lob(X) store as ( tablespace tbs2 );

1 row selected.

Abraços,
Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?