Oracle刪除數(shù)據(jù)非常慢的問(wèn)題及解決
Oracle刪除數(shù)據(jù)非常慢
記一次數(shù)據(jù)庫(kù)刪除數(shù)據(jù)非常慢的處理流程
問(wèn)題描述
單表數(shù)據(jù)3000條左右,根據(jù)主鍵刪除需要509秒
處理流程
一. 首先查看SQL的執(zhí)行計(jì)劃:執(zhí)行計(jì)劃正常,cost只有1,用到了主鍵索引。
二. 查看等待事件:
SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;
先執(zhí)行目標(biāo)sql,在執(zhí)行上面的sql獲得sid
select * from v$session_wait where sid = (上面sql查詢的sid)
顯示的event是db file sequential read,也沒(méi)有異常。
三. 測(cè)試其他其他表和系統(tǒng)io是否有問(wèn)題,沒(méi)問(wèn)題則進(jìn)行下一步
四. 追蹤sql日志:
alter session set events='10046 trace name context forever,level 12'; delete from t_table1 where id = xxx(這里是目標(biāo)sql) alter session set events='10046 trace name context off';
若不知道日志文件存放位置執(zhí)行以下sql會(huì)返回路徑
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'user_dump_dest'
找到最新的trace文件
執(zhí)行—>tkprof orcl_ora_3708.trc myoutput.txt將trc文件轉(zhuǎn)換為簡(jiǎn)單明了的txt文件
查看執(zhí)行刪除過(guò)程中有哪個(gè)操作時(shí)間過(guò)長(zhǎng)
我發(fā)現(xiàn)的問(wèn)題是在實(shí)行刪除的過(guò)程中這個(gè)表有外鍵關(guān)聯(lián)主表,會(huì)先查一遍這個(gè)表里有沒(méi)有那個(gè)設(shè)備的記錄,elapsed表示耗時(shí)
解決辦法,外鍵加索引,或者取消外鍵代碼里維護(hù)外鍵。
Oracle刪除表中大量數(shù)據(jù)卡頓的解決
首先,不要被標(biāo)題誤導(dǎo),分兩種情況。
- 1. 刪之前原表數(shù)據(jù)不要。
- 2. 刪之前保留原表數(shù)據(jù)。
正確姿勢(shì)
oracle數(shù)據(jù)表有過(guò)萬(wàn)條數(shù)據(jù)后,刪除數(shù)據(jù)就變的特別慢,有時(shí)甚至?xí)ㄋ?,所以在此分享一個(gè)小白操作,望對(duì)各位有幫助。
刪除前: 從原表創(chuàng)建新表,即:先把需要的某些數(shù)據(jù)導(dǎo)入到新表里,或者不加條件即要?jiǎng)h除原表的所有數(shù)據(jù),從原表創(chuàng)建臨時(shí)表(新表)。(相當(dāng)于原模原樣拷貝一份原表)
create table tempTable as select id,name from table1 where sj>to_date('2013-7-31 23:59:59','yyyy-mm-dd hh24:mi:ss');
接著直接 drop 刪除原表,把新表名稱改為原表名稱。到此結(jié)束,這樣直接跳過(guò)刪除原表因數(shù)據(jù)多造成卡死的現(xiàn)象節(jié)省時(shí)間。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
oracle數(shù)據(jù)庫(kù)下統(tǒng)計(jì)專營(yíng)店的男女?dāng)?shù)量的語(yǔ)句
oracle數(shù)據(jù)庫(kù)下統(tǒng)計(jì)專營(yíng)店的男女?dāng)?shù)量的語(yǔ)句,方便需要的朋友2012-07-07Oracle中手動(dòng)刪除數(shù)據(jù)庫(kù)教程
這篇文章主要介紹了Oracle中手動(dòng)刪除數(shù)據(jù)庫(kù)教程,本文給出了詳細(xì)步驟以及清除ASM數(shù)據(jù)庫(kù)的步驟,需要的朋友可以參考下2014-10-10在Oracle數(shù)據(jù)庫(kù)中同時(shí)更新兩張表的簡(jiǎn)單方法
這篇文章主要介紹了在Oracle數(shù)據(jù)庫(kù)中同時(shí)更新兩張表的簡(jiǎn)單方法,同時(shí)介紹了一種差異性合并更新的方法,需要的朋友可以參考下2015-11-11解決Oracle數(shù)據(jù)庫(kù)歸檔日志占滿磁盤空間問(wèn)題
這篇文章主要介紹了解決Oracle數(shù)據(jù)庫(kù)歸檔日志占滿磁盤空間問(wèn)題,文中給大家提到了常用命令及實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-08-08oracle 數(shù)據(jù)泵導(dǎo)入導(dǎo)出介紹
本文將介紹oracle數(shù)據(jù)泵導(dǎo)導(dǎo)出步驟詳細(xì)介紹,需要的朋友可以參考下2012-12-12oracle sql語(yǔ)言模糊查詢--通配符like的使用教程詳解
這篇文章主要介紹了oracle sql語(yǔ)言模糊查詢--通配符like的使用教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04判定一個(gè)字符串是否為有效時(shí)間的函數(shù)
判定時(shí)間是否有效的函數(shù),為有效時(shí)間則返回1,不是有效時(shí)間則返回0,需要的朋友可以參考下2014-07-07