Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


quinta-feira, 2 de janeiro de 2014

Movendo tabelas, índices e segmentos LOB para tablespaces distintas no Oracle

Por Eduardo Legatti

Olá,

Como já mencionado no artigo de Março/2008 na qual eu faço uma breve introdução ao conceito de tablespaces no Oracle, um banco de dados Oracle consiste em uma ou mais unidades de armazenamento lógicas denominadas tablespaces, que armazenam coletivamente todos os dados do banco de dados. Cada tablespace em um banco de dados Oracle consiste em um ou mais arquivos denominados arquivos de dados (data files), que são estruturas físicas compatíveis com o sistema operacional no qual o Oracle é executado. Vale a pena salientar que os arquivos de banco de dados também podem ser criados utilizando o ASM (Automatic Storage Manager) que é um gerenciador de volumes e ao mesmo tempo um sistema de arquivos para banco de dados Oracle. Em resumo, os dados de um banco de dados Oracle são armazenados coletivamente nos arquivos de dados que constituem cada tablespace do banco de dados. É aconselhável não misturar dados de aplicativos em um mesmo tablespace. Recomendo que, ao criar tablespaces para seus aplicativos, dê a eles um nome descritivo (por exemplo, dados de um sistema de RH podem ser mantidos no tablespace RECURSOS_HUMANOS). Neste caso, uma aplicação específica poderá ter seus dados separados logicamente de outras aplicações em um mesmo banco de dados. Uma outra vantagem em separar as aplicações em tablespaces distintos seria a oportunidade de utilizar o método Tablespace Point-in-Time Recovery (TSPITR) caso necessário, durante um evento de recover sem prejudicar as demais aplicações. Assim como mencionado no artigo de Junho/2008 sobre a reorganização de tablespaces, irei tratar nesse artigo sobre a organização de segmentos de banco de dados que poderão residir em tablespaces específicos separados das tabelas. Os segmentos são objetos que ocupam espaço em um banco de dados. Existem vários tipos de segmentos como tabelas, índices, segmentos de undo, segmentos temporários, LOB, entre outros. Neste artigo irei tratar especificamente da realocação de índices e segmentos LOB para outros tablespaces. No meu ponto de vista, separar esses segmentos em tablespaces distintos podem trazer alguns benefícios para quem administra o banco de dados.


O cenário que irei criar possui um schema de banco de dados (SCOTT) que possui 3 tabelas contendo várias colunas entre elas colunas do tipo LOB (BLOB, CLOB) além alguns índices. Inicialmente, tanto as tabelas/índices quantos os segmento LOB estão alocados em uma única tablespace TBS_DATA. O objetivo principal será demonstrar como mover não só os segmentos LOB para uma tablespace específica chamada TBS_LOB, como também mover todos os índices para uma tablespace específica chamada TBS_INDX. Ao final, irei demonstrar como mover as tabelas para uma outra tablespace.

C:\>sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Qui Jan 2 10:15:39 2014

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

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SELECT ANY DICTIONARY

11 linhas selecionadas.

Acima estou demonstrando que concedi o privilégio de sistema SELECT ANY DICTIONARY para o usuário SCOTT de forma que o mesmo tenha acesso às views de dicionário de dados DBA_*. Abaixo está o resultado dos dados do schema SCOTT separados por tipo de segmento. A consulta SQL utilizada é mesma usada no artigo de Maio/2005 intitulado de "Qual é mesmo o tamanho de uma tabela no Oracle?".

SQL> break on report
SQL> compute sum of data_mb on report
SQL> compute sum of indx_mb on report
SQL> compute sum of lob_mb on report
SQL> compute sum of total_mb on report

SQL> SELECT table_name,
  2         DECODE(partitioned,'/','NO',partitioned) partitioned,
  3         num_rows,
  4         data_mb,
  5         indx_mb,
  6         lob_mb,
  7         total_mb
  8      FROM (SELECT data.table_name,
  9                   partitioning_type
 10                   || DECODE (subpartitioning_type,
 11                              'NONE', NULL,
 12                              '/' || subpartitioning_type)
 13                      partitioned,
 14                   num_rows,
 15                   NVL(data_mb,0) data_mb,
 16                   NVL(indx_mb,0) indx_mb,
 17                   NVL(lob_mb,0) lob_mb,
 18                   NVL(data_mb,0) + NVL(indx_mb,0) + NVL(lob_mb,0) total_mb
 19              FROM (  SELECT table_name,
 20                             NVL(MIN(num_rows),0) num_rows,
 21                             ROUND(SUM(data_mb),2) data_mb
 22                        FROM (SELECT table_name, num_rows, data_mb
 23                                FROM (SELECT a.table_name,
 24                                             a.num_rows,
 25                                             b.bytes/1024/1024 AS data_mb
 26                                        FROM user_tables a, user_segments b
 27                                       WHERE a.table_name = b.segment_name))
 28                    GROUP BY table_name) data,
 29                   (  SELECT a.table_name,
 30                             ROUND(SUM(b.bytes/1024/1024),2) AS indx_mb
 31                        FROM user_indexes a, user_segments b
 32                       WHERE a.index_name = b.segment_name
 33                    GROUP BY a.table_name) indx,
 34                   (  SELECT a.table_name,
 35                             ROUND(SUM(b.bytes/1024/1024),2) AS lob_mb
 36                        FROM user_lobs a, user_segments b
 37                       WHERE a.segment_name = b.segment_name
 38                    GROUP BY a.table_name) lob,
 39                   user_part_tables part
 40             WHERE     data.table_name = indx.table_name(+)
 41                   AND data.table_name = lob.table_name(+)
 42                   AND data.table_name = part.table_name(+))
 43  ORDER BY table_name;

TABLE_NAME     PARTITIONED       NUM_ROWS    DATA_MB    INDX_MB     LOB_MB   TOTAL_MB
-------------- --------------- ---------- ---------- ---------- ---------- ----------
T1             NO                   12000         31       5,25     384,06     420,31
T2             NO                   50000        400      12,13        ,13     412,26
T3             NO                  180000       1472     232,13        ,13    1704,26
                                          ---------- ---------- ---------- ----------
sum                                             1903     249,51     384,32    2536,83

3 linhas selecionadas.

Abaixo estão listados os segmentos de tabela, índices e LOB. Podemos perceber que todos os segmentos estão alocados na tablespace TBS_DATA.

SQL> SELECT owner,
  2         segment_name,
  3         segment_type,
  4         tablespace_name
  5    FROM dba_segments
  6   WHERE owner = 'SCOTT';

OWNER                SEGMENT_NAME                 SEGMENT_TYPE       TABLESPACE_NAME
-------------------- ---------------------------- ------------------ ------------------
SCOTT                T1                           TABLE              TBS_DATA
SCOTT                T2                           TABLE              TBS_DATA
SCOTT                T3                           TABLE              TBS_DATA
SCOTT                IDX_T1_01                    INDEX              TBS_DATA
SCOTT                IDX_T1_02                    INDEX              TBS_DATA
SCOTT                IDX_T1_03                    INDEX              TBS_DATA
SCOTT                IDX_T1_04                    INDEX              TBS_DATA
SCOTT                IDX_T2_01                    INDEX              TBS_DATA
SCOTT                IDX_T2_02                    INDEX              TBS_DATA
SCOTT                IDX_T2_03                    INDEX              TBS_DATA
SCOTT                IDX_T3_01                    INDEX              TBS_DATA
SCOTT                IDX_T3_02                    INDEX              TBS_DATA
SCOTT                SYS_IL0000141649C00005$$     LOBINDEX           TBS_DATA
SCOTT                SYS_IL0000141654C00004$$     LOBINDEX           TBS_DATA
SCOTT                SYS_IL0000141654C00005$$     LOBINDEX           TBS_DATA
SCOTT                SYS_IL0000141644C00004$$     LOBINDEX           TBS_DATA
SCOTT                SYS_IL0000141644C00005$$     LOBINDEX           TBS_DATA
SCOTT                SYS_IL0000141649C00004$$     LOBINDEX           TBS_DATA
SCOTT                SYS_LOB0000141644C00004$$    LOBSEGMENT         TBS_DATA
SCOTT                SYS_LOB0000141644C00005$$    LOBSEGMENT         TBS_DATA
SCOTT                SYS_LOB0000141649C00004$$    LOBSEGMENT         TBS_DATA
SCOTT                SYS_LOB0000141649C00005$$    LOBSEGMENT         TBS_DATA
SCOTT                SYS_LOB0000141654C00004$$    LOBSEGMENT         TBS_DATA
SCOTT                SYS_LOB0000141654C00005$$    LOBSEGMENT         TBS_DATA

24 linhas selecionadas.

Como dito anteriormente, o objetivo será mover os segmentos de índices e de LOBs para as tablespaces TBS_INDX e TBS_LOB respectivamente.

SQL> select tablespace_name,
  2         contents,
  3         extent_management,
  4         segment_space_management
  5    from dba_tablespaces
  6    order by 1;

TABLESPACE_NAME                CONTENTS  EXTENT_MAN SEGMEN
------------------------------ --------- ---------- ------
SYSAUX                         PERMANENT LOCAL      AUTO
SYSTEM                         PERMANENT LOCAL      MANUAL
TBS_DATA                       PERMANENT LOCAL      AUTO
TBS_INDX                       PERMANENT LOCAL      AUTO
TBS_LOB                        PERMANENT LOCAL      AUTO
TEMP                           TEMPORARY LOCAL      MANUAL
UNDOTBS1                       UNDO      LOCAL      MANUAL
USERS                          PERMANENT LOCAL      AUTO

8 linhas selecionadas.


Movendo LOBs


Segue abaixo o comando DDL que deverá ser utilizado para mover um segmento LOB para uma outra tablespace:

ALTER TABLE [Table_Name] MOVE LOB([Column_Name]) store as (TABLESPACE [Tablespace_Name]);

Se caso quisermos mover todos os segmentos LOB de um schema para uma tablespace específica (TBS_LOB), poderemos utilizar a consulta abaixo:

 SQL> SELECT   'alter table '
  2           || t.owner
  3           || '.'
  4           || t.table_name
  5           || ' move lob ('
  6           || column_name
  7           || ') store as (tablespace TBS_LOB);' CMD
  8      FROM dba_lobs l, dba_tables t
  9     WHERE     l.owner = t.owner
 10           AND l.table_name = t.table_name
 11           AND l.SEGMENT_NAME IN
 12                  (SELECT segment_name
 13                     FROM dba_segments
 14                    WHERE segment_type = 'LOBSEGMENT'
 16                          AND OWNER = 'SCOTT' 
 17                          AND tablespace_name = 'TBS_DATA')
 18           AND l.owner = 'SCOTT'
 19  ORDER BY t.owner, t.table_name;

CMD
----------------------------------------------------------------------
alter table SCOTT.T1 move lob (IMAGEM) store as (tablespace TBS_LOB);
alter table SCOTT.T1 move lob (SUMARIO) store as (tablespace TBS_LOB);
alter table SCOTT.T2 move lob (FOTO) store as (tablespace TBS_LOB);
alter table SCOTT.T2 move lob (SUMARIO) store as (tablespace TBS_LOB);
alter table SCOTT.T3 move lob (IMG_01) store as (tablespace TBS_LOB);
alter table SCOTT.T3 move lob (SAT_01) store as (tablespace TBS_LOB);

6 linhas selecionadas.

Agora irei executar o resultado da consulta afim de mover todos os segmentos LOB para a tablespace TBS_LOB. Vale a pena salientar que ao mover os segementos de LOB, os índices das tabelas ficarão UNUSABLE e precisarão ser reconstruídos.

SQL> set timing on
SQL> alter table SCOTT.T1 move lob (IMAGEM) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:00:00.89
SQL> alter table SCOTT.T1 move lob (SUMARIO) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:00:23.24
SQL> alter table SCOTT.T2 move lob (FOTO) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:00:31.92
SQL> alter table SCOTT.T2 move lob (SUMARIO) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:00:28.93
SQL> alter table SCOTT.T3 move lob (IMG_01) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:01:48.34
SQL> alter table SCOTT.T3 move lob (SAT_01) store as (tablespace TBS_LOB);

Tabela alterada.

Decorrido: 00:02:39.70


Movendo Índices


Segue abaixo o comando DDL que deverá ser utilizado para mover um índice para uma outra tablespace:

ALTER INDEX [Index_Name] REBUILD TABLESPACE [Tablespace_Name];


Se caso quisermos mover todos os segmentos de índices de um schema para uma tablespace específica (TBS_INDX), poderemos utilizar a consulta abaixo:
SQL> SELECT ' alter index '
  2         || owner
  3         || '.'
  4         || index_name
  5         || ' rebuild tablespace TBS_INDX;' CMD
  6    FROM dba_indexes
  7   WHERE index_type <> 'LOB' AND owner = 'SCOTT';

CMD
---------------------------------------------------------
 alter index SCOTT.IDX_T1_01 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T1_02 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T1_03 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T1_04 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T2_01 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T2_02 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T2_03 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T3_01 rebuild tablespace TBS_INDX;
 alter index SCOTT.IDX_T3_02 rebuild tablespace TBS_INDX;

9 linhas selecionadas.


Agora irei executar o resultado da consulta afim de mover todos os segmentos de índices para a tablespace TBS_INDX.

SQL>  alter index SCOTT.IDX_T1_01 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.41
SQL>  alter index SCOTT.IDX_T1_02 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.05
SQL>  alter index SCOTT.IDX_T1_03 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.05
SQL>  alter index SCOTT.IDX_T1_04 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.06
SQL>  alter index SCOTT.IDX_T2_01 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.45
SQL>  alter index SCOTT.IDX_T2_02 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.52
SQL>  alter index SCOTT.IDX_T2_03 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:00.53
SQL>  alter index SCOTT.IDX_T3_01 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:10.92
SQL>  alter index SCOTT.IDX_T3_02 rebuild tablespace TBS_INDX;

Índice alterado.

Decorrido: 00:00:11.91

Após a realocação dos segmentos de LOB e de índices, podemos ver abaixo como ficou o layout do banco de dados.

SQL> SELECT owner,
  2         segment_name,
  3         segment_type,
  4         tablespace_name
  5    FROM dba_segments
  6   WHERE owner = 'SCOTT';

OWNER                SEGMENT_NAME                 SEGMENT_TYPE       TABLESPACE_NAME
-------------------- ---------------------------- ------------------ ------------------
SCOTT                T1                           TABLE              TBS_DATA
SCOTT                T2                           TABLE              TBS_DATA
SCOTT                T3                           TABLE              TBS_DATA
SCOTT                IDX_T1_01                    INDEX              TBS_INDX
SCOTT                IDX_T1_02                    INDEX              TBS_INDX
SCOTT                IDX_T1_03                    INDEX              TBS_INDX
SCOTT                IDX_T1_04                    INDEX              TBS_INDX
SCOTT                IDX_T2_01                    INDEX              TBS_INDX
SCOTT                IDX_T2_02                    INDEX              TBS_INDX
SCOTT                IDX_T2_03                    INDEX              TBS_INDX
SCOTT                IDX_T3_01                    INDEX              TBS_INDX
SCOTT                IDX_T3_02                    INDEX              TBS_INDX
SCOTT                SYS_IL0000141649C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141654C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141654C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141644C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141644C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141649C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_LOB0000141644C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141644C00005$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141649C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141649C00005$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141654C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141654C00005$$    LOBSEGMENT         TBS_LOB

24 linhas selecionadas.


Movendo tabelas


Para finalizar, caso seja necessário mover alguma tabela para uma outra tablespace, o comando DDL abaixo deverá ser utilizado para fazer esse trabalho:

ALTER TABLE [Table_Name] MOVE TABLESPACE [Tablespace_Name]; 


  
Como exemplo, irei mover todas as tabelas do schema SCOTT para a tablespace USERS.

SQL> SELECT ' alter table '
  2         || owner
  3         || '.'
  4         || table_name
  5         || ' move tablespace USERS;' CMD
  6    FROM dba_tables
  7   WHERE owner = 'SCOTT';

CMD
--------------------------------------------
 alter table SCOTT.T1 move tablespace USERS;
 alter table SCOTT.T2 move tablespace USERS;
 alter table SCOTT.T3 move tablespace USERS;

3 linhas selecionadas.

SQL>  alter table SCOTT.T3 move tablespace USERS;

Tabela alterada.

Decorrido: 00:01:43.42
SQL>  alter table SCOTT.T2 move tablespace USERS;

Tabela alterada.

Decorrido: 00:00:33.89
SQL>  alter table SCOTT.T1 move tablespace USERS;

Tabela alterada.

Decorrido: 00:00:01.45

Após a realocação das tabelas para uma outra tablespace (USERS), poderemos notar que todos os índices das tabelas envolvidas, ficaram inválidos (UNUSABLE). Isso ocorreu devido a alteração dos ROWIDs das linhas das tabelas durante o processo de movimentação. Para corrigir esse problema, termos que reconstruir todos os índices envolvidos. 

SQL> SELECT owner, index_name, status, tablespace_name
  2    FROM dba_indexes
  3   WHERE owner = 'SCOTT' AND status <> 'VALID';

OWNER                      INDEX_NAME                STATUS     TABLESPACE_NAME
-------------------------- ------------------------- ---------- ------------------
SCOTT                      IDX_T1_01                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T1_02                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T1_03                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T1_04                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T2_01                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T2_02                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T2_03                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T3_01                 UNUSABLE   TBS_INDX
SCOTT                      IDX_T3_02                 UNUSABLE   TBS_INDX

9 linhas selecionadas.

SQL> SELECT ' alter index ' 
  2         || owner 
  3         || '.' 
  4         || index_name 
  5         || ' rebuild;' CMD
  6    FROM dba_indexes
  7   WHERE owner = 'SCOTT' AND status <> 'VALID';

CMD
-------------------------------------
 alter index SCOTT.IDX_T1_01 rebuild;
 alter index SCOTT.IDX_T1_02 rebuild;
 alter index SCOTT.IDX_T1_03 rebuild;
 alter index SCOTT.IDX_T1_04 rebuild;
 alter index SCOTT.IDX_T2_01 rebuild;
 alter index SCOTT.IDX_T2_02 rebuild;
 alter index SCOTT.IDX_T2_03 rebuild;
 alter index SCOTT.IDX_T3_01 rebuild;
 alter index SCOTT.IDX_T3_02 rebuild;

9 linhas selecionadas.


Após a execução da consulta acima, irei executar o resultado da mesma afim de reconstruir todos os índices que ficaram inválidos.

SQL>  alter index SCOTT.IDX_T1_01 rebuild;

Índice alterado.

Decorrido: 00:00:00.20
SQL>  alter index SCOTT.IDX_T1_02 rebuild;

Índice alterado.

Decorrido: 00:00:00.06
SQL>  alter index SCOTT.IDX_T1_03 rebuild;

Índice alterado.

Decorrido: 00:00:00.05
SQL>  alter index SCOTT.IDX_T1_04 rebuild;

Índice alterado.

Decorrido: 00:00:00.07
SQL>  alter index SCOTT.IDX_T2_01 rebuild;

Índice alterado.

Decorrido: 00:00:00.46
SQL>  alter index SCOTT.IDX_T2_02 rebuild;

Índice alterado.

Decorrido: 00:00:00.50
SQL>  alter index SCOTT.IDX_T2_03 rebuild;

Índice alterado.

Decorrido: 00:00:00.59
SQL>  alter index SCOTT.IDX_T3_01 rebuild;

Índice alterado.

Decorrido: 00:00:19.43
SQL>  alter index SCOTT.IDX_T3_02 rebuild;

Índice alterado.

Decorrido: 00:00:10.50


Pronto. Por fim, poderemos verificar abaixo que todas as tabelas foram realocadas para a tablespace USERS.

SQL> SELECT owner,
  2         segment_name,
  3         segment_type,
  4         tablespace_name
  5    FROM dba_segments
  6   WHERE owner = 'SCOTT';

OWNER                SEGMENT_NAME                 SEGMENT_TYPE       TABLESPACE_NAME
-------------------- ---------------------------- ------------------ ------------------
SCOTT                T1                           TABLE              USERS
SCOTT                T2                           TABLE              USERS
SCOTT                T3                           TABLE              USERS
SCOTT                IDX_T1_01                    INDEX              TBS_INDX
SCOTT                IDX_T1_02                    INDEX              TBS_INDX
SCOTT                IDX_T1_03                    INDEX              TBS_INDX
SCOTT                IDX_T1_04                    INDEX              TBS_INDX
SCOTT                IDX_T2_01                    INDEX              TBS_INDX
SCOTT                IDX_T2_02                    INDEX              TBS_INDX
SCOTT                IDX_T2_03                    INDEX              TBS_INDX
SCOTT                IDX_T3_01                    INDEX              TBS_INDX
SCOTT                IDX_T3_02                    INDEX              TBS_INDX
SCOTT                SYS_IL0000141649C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141654C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141654C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141644C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141644C00005$$     LOBINDEX           TBS_LOB
SCOTT                SYS_IL0000141649C00004$$     LOBINDEX           TBS_LOB
SCOTT                SYS_LOB0000141644C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141644C00005$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141649C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141649C00005$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141654C00004$$    LOBSEGMENT         TBS_LOB
SCOTT                SYS_LOB0000141654C00005$$    LOBSEGMENT         TBS_LOB

24 linhas selecionadas.



5 comentários:

Eduardo Legatti disse...

Olá,

Apenas uma observação. Ao mover o segmentos de LOB, todos os índices da tabela ficarão no estado UNUSABLE. Neste caso eles precisarão ser reconstruídos.

Abraços

Legatti

Anônimo disse...

Belo post Eduardo.
A questão de mover os lobs e lobindex é somente visando a separação em si?
Qual o ganho real desta separação?

Eduardo Legatti disse...

Olá Anônimo,

Como eu falo no artigo, eu vejo algumas vantagens em separar os segmentos em tablespaces distintas.

* Layout do banco de dados esteticamente organizado.
* Administração do banco de dados simplificada.
* Mais opções de recover dependendo do cenário de desastre.
* Monitoramento de crescimento do banco de dados mais assertivo.

Abraços,

Legatti


Marcos José disse...

Também gosto de separar dados de índices, uma mania muito antiga mas colunas clob ainda tenho dúvidas. Qual seria o tamanho do bloco para esta tablespace específica para receber essas colunas?

Excelente material, didáticas excelente.
Parabéns.

Eduardo Legatti disse...

Olá Marcos,

Da mesma forma que os segmentos de índices e de tabelas, também gosto de separar os segmentos de LOBs em tablespaces específicas. Não pelo fato de ser positivo em relação a performance, porque acredito que não tenha algum ganho de performance, mas simplesmente pelo fato de que o layout do seu banco de dados fica mais claro e esteticamente mais organizado, ou seja, tablespaces distintas para segmentos distintos. Geralmente uso o tamanho de bloco padrão 8KB para as tablespaces de LOB.

Abraços,

Legatti

Postagens populares