row-chains:行链接的解决办法


-------行链接

/***重建跨多个数据块的数据行

生产环境中,数据变更后会导致很多数据行会存储在多个数据块中。从而导致IO使用频率增高并进一步导致并查询速度变慢。

平时维护中需要DBA重建跨多个数据块的数据行使其每一行数据都尽可能位于一个数据块中.

***/

-------------------------
--1.验证是否有行链接方法
-------------------------

create tablespace test
datafile 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\test01.DBF'
size 5000m
autoextend on
next 100m maxsize unlimited
extent management local autoallocate
segment   space management auto;


create user ocpyang identified by ocpyang
default tablespace test
temporary tablespace temp
;

 

grant dba to ocpyang;

alter user ocpyang
quota unlimited on test;

 

create table t2
(
sid int not null ,
sname nvarchar2(100)
)
tablespace test;

 

 

--循环导入数据
declare
        maxrecords constant int:=300000;
        i int :=1;
    begin
        for i in 1..maxrecords loop
          insert into t2 values(i,'this is a test for ocpyang today!');
        end loop;
    dbms_output.put_line(' 成功录入数据! ');
    commit;
    end;
/


insert into t2 select * from t2;

insert into t2 select * from t2;

insert into t2 select * from t2;

insert into t2 select * from t2;

 

 


col segment_name for a10
col segment_type for a10

select segment_name,segment_type,bytes/1024/1024 as MB from user_segments where segment_name='T2';

SEGMENT_NA SEGMENT_TY         MB
---------- ---------- ----------
T2         TABLE             808

 

select count(*) from t2;

  COUNT(*)
----------
 9600000

 

SQL> delete from t2 where sid<=50000;

已删除50000行。

SQL> commit;

提交完成。


update t2 set sname='this is a test about row chain! welcome to ocpyang blog,thank you!' where sid<100000;

 

-------------------------
--2.验证是否有行链接
-------------------------

-----方法1:段顾问


--(1).查看顾问建议

1).创建一个任务

2).为这个任务分配一个对象

3).设置任务数

4).执行这个任务

begin
declare
my_task_id number;
obj_id number;
my_task_name varchar2(100);
my_task_desc varchar2(200);
begin
  my_task_name :='ocpyang';
  my_task_desc :='手动段顾问建议';
  --step1:
  dbms_advisor.create_task
  (
  advisor_name =>'Segment Advisor',
  task_id =>my_task_id,
  task_name =>my_task_name,
  task_desc =>my_task_desc
  );

  --step2:
  dbms_advisor.create_object
  (
  task_name =>my_task_name,
  object_type =>'TABLE', 
  attr1 =>'OCPYANG',  --用户名
  attr2 =>'T2',   --表名
  attr3 =>NULL,
  attr4 =>NULL,
  attr5 =>NULL,
  object_id =>obj_id
  );


  --step3:
  dbms_advisor.set_task_parameter
  (
  task_name =>my_task_name,
  parameter =>'recommend_all',
  value =>'TRUE'
  );


  --step4:
  dbms_advisor.execute_task(my_task_name);
end;
end;
/


--删除
exec DBMS_ADVISOR.DELETE_TASK('ocpyang');

 


---查询1:获取顾问建议

SELECT
'Task Name        : ' || f.task_name || chr(10) ||
'Segment Name     : ' || o.attr2     || chr(10) ||
'Segment Type     : ' || o.type      || chr(10) ||
'Partition Name   : ' || o.attr3     || chr(10) ||
'Message          : ' || f.message   || chr(10) ||
'More Info        : ' || f.more_info TASK_ADVICE
FROM dba_advisor_findings f
    ,dba_advisor_objects  o
WHERE o.task_id = f.task_id
AND o.object_id = f.object_id
AND f.task_name like 'ocpyang'
ORDER BY f.task_name;


TASK_ADVICE
--------------------------------------------------------------------------------

Task Name        : ocpyang
Segment Name     : T2
Segment Type     : TABLE
Partition Name   :
Message          : 此对象中的空闲空间小于 10MB。
More Info        : 分配空间:3145728: 已用空间:2025670: 可回收空间:1120058:

Task Name        : ocpyang
Segment Name     : T2
Segment Type     : TABLE
Partition Name   :

TASK_ADVICE
--------------------------------------------------------------------------------

Message          :通过重新组织,可以删除该对象具有的行链接(参考)

 

 

 

---(2).解决方法:移动表(移动表后需要重建所有索引)

alter table t2 move;

验证索引状态:
select owner,index_name,status from dba_indexes where table_name='T2';

alter index pk_t2 rebuild;

 

 

----------方法2:analyze table

---(1).分析表

@?\RDBMS\ADMIN\utlchain.sql;


analyze table ocpyang.t2 list chained rows;


select count(*) from chained_rows where table_name='T2';

 COUNT(*)
---------
   664586

 

 

---(2).解决方法:

create table t22
as
select * from ocpyang.t2
where rowid in(select head_rowid from chained_rows where table_name='T2');


delete from ocpyang.t2
where rowid in (select head_rowid from chained_rows where table_name='T2');


insert into ocpyang.t2 select * from t22;


------重新分析查看是否还有行链接

truncate table chained_rows;

analyze table ocpyang.t2 list chained rows;


--如果返回0就说明解决了行链接.
select count(*) from chained_rows where table_name='T2';

 COUNT(*)
---------
0

drop table t22;

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值