DELETE 比 SELECT 執行速度慢的測試報告

jackson198574發表於2013-12-13
DELETE 比 SELECT 執行速度慢的測試報告

  
問題:
發現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... 歡迎多多討論!~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20802110/viewspace-1063226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章