DELETE 比 SELECT 执行速度慢的测试报告

6310阅读 0评论2013-08-16 jackson198574
分类:Oracle

  
问题:
发现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... 欢迎多多讨论!~


上一篇:Failure at final check of Oracle CRS stack.
下一篇: RMAN备份、恢复实验室 之 备份篇 【rman: can't open target】