PCTFREE RECOMENDADO DE 20% EVITA MIGRAÇÃO E ENCADEAMENTO. |
Migração e Encadeamento
- A migração de uma linha ocorre quando tentamos efetuar uma alteração nos dados dela e não existe espaço suficiente no bloco de dados Oracle para que a operação ocorra nesse bloco.- Nessa situação, a linha é migrada do bloco atual para outro bloco com mais espaço.
- Isso ocorre normalmente quando o parâmetro PCTFREE é definido com um valor muito baixo.
Prática 1/6
A migração de uma linha ocorre quando tentamos efetuar uma alteração nos dados dela e não existe espaço suficiente no bloco de dados Oracle para que a operação ocorra nesse bloco. Nessa situação, a linha é migrada do bloco atual para outro bloco com mais espaço. Isso ocorre, normalmente, quando o parâmetro PCTFREE é definido com um valor muito baixo. Para testar essa situação vamos criar uma tabela com o valor do PCTFREE igual a zero.
----------PCTFREE É SETADO COM 0 (ZERO), OU SEJA, NÃO DEIXAMOS OS 20% EXTRAS PARA POSSÍVEIS ALTERAÇÕES -----
CREATE TABLE migracao1 (ID NUMBER,NOME varCHAR2(50)) PCTFREE 0 tablespace users;
Prática 2/6
Ao inserirmos os dados na tabela não ocorrerá a migração. A migração só ocorre quando executamos um comando de atualização.
INSERT INTO migracao1 VALUES (1,'TESTE');
INSERT INTO migracao1 VALUES (2,'TESTE');
INSERT INTO migracao1 VALUES (3,'TESTE');
INSERT INTO migracao1 VALUES (4,'TESTE');
INSERT INTO migracao1 VALUES (5,'TESET');
INSERT INTO migracao1 VALUES (6,'TESTE');
INSERT INTO migracao1 VALUES (7,'TESTE');
INSERT INTO migracao1 VALUES (8,'TESTE');
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
INSERT INTO migracao1 (SELECT * FROM migracao1);
COMMIT;
Prática 3/6
Iremos alterar o texto “TESTE” para “MARTE E JUPITER ”. Como o PCTFREE é 0 não há espaço livre no bloco para essa operação. Neste momento ocorrerá a migração.UPDATE migracao1
SET NOME='MARTE E JUPITER'
WHERE ID=1 or ID=3 or ID=5 or ID=7;
COMMIT;
Prática 4/6
Vamos detectar as linhas migradas usando o comando ANALYZE, no entanto, poderíamos obter essa informação através do SEGMENT ADVISOR.
Nota: ANALYZE TABLE
ANALYZE TABLE migracao1 COMPUTE STATISTICS;
SELECT num_rows "Numero de Linhas", chain_cnt "Numero de Linhas Migradas"
FROM dba_tables WHERE table_name='MIGRACAO1';
Prática 5/6 CHAINED_ROWS
Também podemos detectar as linhas encadeadas. Para isso usamos a tabela CHAINED_ROWS, que é criada pelo script abaixo.
-----utlchain.sql é um script residente no ORACLE, assim como outros utilitários.-------
@%ORACLE_HOME%\rdbms\admin\utlchain.sql ANALYZE TABLE migracao1 LIST CHAINED ROWS;
SELECT owner_name "Dono da Tabela",
table_name "Nome da Tabela",
head_rowid "Rowid"
FROM chained_rows
WHERE table_name = 'MIGRACAO1';
Vemos Quantidade de Seccionamento que Ocorreram nas Linhas |
Prática 6/6
Para eliminar as linhas migradas e/ou encadeadas basta movê-las.
----tabela migracao1 é locada para outra local na memória--------
alter table migracao1 move tablespace sysaux;
----tabela migracao1 é relocada para seu local de origem--------
alter table migracao1 move tablespace users;
ANALYZE TABLE migracao1 COMPUTE STATISTICS;
SELECT num_rows "Numero de Linhas",
chain_cnt "Numero de Linhas Migradas"
FROM dba_tables
WHERE table_name='MIGRACAO1';
Vemos acima que antes de movermos a table, havia muitas linhas encadeadas, 666 no exemplo. Após locar e relocar a table, refizemos um ANALYSE TABLE e exibimos o resultado.
Nenhum comentário:
Postar um comentário