● ITPUB名人堂嘉宾 ● ChinaUnix社区博客专家 ● ChinaUnix社区Oracle板块版主 ● 优酷网认证音乐牛人:EricGuitar ● SDOUG 核心成员 ●E-mail:gaoqiangdba@163.com
分类: Oracle
2013-08-16 10:02:09
问题:
发现delete的速度不如select的速度快。
分析: 导致delete速度慢的原因有很多,比如:
1.写大量回滚段,在RAID5上,写回滚段速度相对更慢,因为需要写校验位。
2.外键影响
3.在线用户访问过多,可以查看v%session_wait
4.没有表分区
实验:
基础环境建设:
创建tom用户的表空间:
create tablespace tom datafile '/opt/ora10g/oradata/jssbook/jssbook/tom01.dbf'
size 50m
autoextend on
next 32m maxsize 2048m
extent management local;
确定创建成功:
select name from v$datafile where name like '%tom%'
创建tom用户:
create user tom identified by "123456"
default tablespace tom
profile default
account unlock;
给用户授权:
grant dba to tom
查看临时表空间:
select * from v$tempfile
注:创建时没有声明,则用默认表空间。
查看test表大小:
select segment_name, bytes
from user_segments
where segment_type = 'TABLE';
查看test数据量:
select count(*) from test
向test表中注入数据:(该语句执行了N遍,不停地刷,不停地刷,最后达到150万条数据之后进行下一步---delete)
insert /* +append */ into tom.test select * from all_objects
删除表中数据:
delete from test;
下面是监控语句,这些语句分别在刚注入150万条数据之后执行了一下,抓了下状态,然后又在执行过程中抓了一下。(只抓取相应变化比较大的字段)
1.查看回滚段信息(tom用户使用)
select * from V$ROLLSTAT
删除之前信息:
删除之后信息:
2.查看回滚段的统计信息:
SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status
FROM v$rollname n, v$rollstat s
WHERE n.usn = s.usn;
删除之前信息:
删除之后信息:
3.查看回滚段用户征用情况:
SELECT s.username, u.name
FROM v$transaction t, v$rollstat r, v$rollname u, v$session s
WHERE s.taddr = t.addr
AND t.xidusn = r.usn
AND r.usn = u.usn
ORDER BY s.username;
只有一个用户使用回滚段:
结论:
用delete删除确实产生了大量回滚段,是造成delete速度慢的因素之一。
其他原因正在补充中ing... 欢迎多多讨论!~