Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3058107
  • 博文数量: 206
  • 博客积分: 3409
  • 博客等级: 中校
  • 技术积分: 4066
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-24 10:21
个人简介

● ITPUB名人堂嘉宾 ● ChinaUnix社区博客专家 ● ChinaUnix社区Oracle板块版主 ● 优酷网认证音乐牛人:EricGuitar ● SDOUG 核心成员 ●E-mail:gaoqiangdba@163.com

文章分类

全部博文(206)

文章存档

2021年(11)

2020年(7)

2019年(7)

2016年(5)

2015年(36)

2014年(23)

2013年(15)

2012年(23)

2011年(61)

2010年(18)

分类: 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... 欢迎多多讨论!~


阅读(6235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~