Um banco de dados Oracle 12c tem uma tabela com linhas encadeadas:
select
owner c1,
table_name c2,
pct_free c3,
pct_used c4,
avg_row_len c5,
num_rows c6,
chain_cnt c7,
chain_cnt/num_rows c8
from dba_tables
where
owner not in ('SYS','SYSTEM')
and
table_name not in
(select table_name from dba_tab_columns
where
data_type in ('RAW','LONG RAW','CLOB','BLOB','NCLOB')
)
and
chain_cnt > 0
order by chain_cnt desc
;
RESULT:
C1 C2 C3 C4 C5 C6 C7 C8
SCHEMA_XY PERSON 10 662 98.930 85.872 1
Eu entendo que esta tabela tem 85,872% de linhas encadeadas. Eu tentei:
alter table SCHEMA_XY.PERSON move;
alter table SCHEMA_XY.PERSON move pctfre 30;
SELECT 'alter index '||OWNER||'.'||INDEX_NAME||' rebuild online ;'FROM DBA_INDEXES where TABLE_NAME='PERSON';
As Filas Encadeadas permanecem altas. A tabela tem 250 colunas principalmente varchar2 e number. Como posso corrigi-lo?
Você tem muitas colunas e um comprimento médio de linha alto (662). Talvez você até tenha linhas maiores que o tamanho do bloco.
Com filas longas, é inevitável ter filas encadeadas. Exemplo com tamanho de bloco de 8K:
Certifique-se também de executar
ANALYZE TABLE
, porque é isso que atualizaCHAIN_CNT
.Linhas encadeadas é causada por linhas que são muito largas para caber em um (% de a) Bloco de Dados. A maneira mais fácil de criar linhas encadeadas é ter muitas colunas.
Suas escolhas são:
Assim que o comprimento total da linha exceder o tamanho do bloco Oracle (menos alguns bytes para cabeçalho etc.) OU você exceder 255 colunas OU tiver colunas LONG ou LOB, você não poderá evitar linhas encadeadas.
Você usou column
chain_cnt
, que é atualizado apenas caso você esteja realizandoANALYZE TABLE PERSON COMPUTE STATISTICS;
Então, talvez você tenha lido
chain_cnt
sem novo ANALYZE?Se as linhas forem maiores que o tamanho do bloco, uma boa ideia seria usar o espaço de tabela com um tamanho de bloco maior.