Oracle 12c 数据库有一个包含链式行的表:
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
我知道这个表有 85.872 % 链接的行。我试过了:
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';
Chained Rows 仍然很高。该表有 250 列,主要是 varchar2 和数字。我该如何解决?
你有很多列和很高的平均行长度(662)。也许您的行数甚至超过了块的大小。
对于长行,链式行是不可避免的。8K 块大小的示例:
还要确保你运行
ANALYZE TABLE
,因为那是更新CHAIN_CNT
。Chained Rows 是由行太宽而无法容纳(a)数据块的行引起的。创建链接行的最简单方法是拥有很多列。
您的选择是:
一旦总行长度超过 Oracle 块大小(减去标题等的一些字节)或超过 255 列或具有 LONG 或 LOB 列,您就无法避免链接行。
您已使用 column
chain_cnt
,仅在您执行时才会更新ANALYZE TABLE PERSON COMPUTE STATISTICS;
那么,也许您已经阅读了
chain_cnt
没有新的 ANALYZE 的内容?如果原因是行长于块大小,那么一个好主意是使用具有更大块大小的表空间。