oracle表查詢速度極慢的處理過程記錄一下
https://blog.csdn.net/haitaofeiyang/article/details/50855401
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/haitaofeiyang/article/details/50855401
Oracle 單個表查詢速度極慢處理過程
現象:前兩天看到我們的oracle數據庫,一條查詢語句執行的特別慢,導致應用程序連接超時,客戶根本查不出來東西,非常着急。后來在plus中執行select count(1) from fee,也特別慢,這張表一共才50w的數據。
配置: Oracle 11G RAC 、linux redhat操作系統
處理過程:
我最開始認為是不是查詢語句的問題,或者索引的問題。於是把性能差的語句截出來看了看。
SELECT * FROM (select * FROM v$sqlarea order BY disk_reads DESC )where ROWNUM<10;
前十條基本都是查詢有分頁的情況,數據庫在計算分頁的總條數。於是根據SQL建了幾個字段的索引,日期和BU_CD等字段。結果優化的不是很理想。
查了一下 上一篇網友提供的步驟,覺得思路特別對,於是就按照執行了一遍。然后查看了alert日志,看了看臨時表空間和系統表空間的狀況,結果兩個節點都很正常沒有問題;最后懷疑是表鎖的問題。
-
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
-
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
-
FROM v$sqlarea a,v$session s, v$locked_object l
-
WHERE l.session_id = s.sid
-
AND s.prev_sql_addr = a.address
-
ORDER BY sid, s.serial#;
也沒有鎖表的問題。奇怪,最后查了一下所有連接庫的session運行情況。
-
select distinct a.sid,b.SERIAL#,b.PROCESS,b.STATUS from v$session_wait a,v$session b
-
where a.SID=b.SID
最后查出來有一堆的session,基本分不清什么連接,於是粗暴的把session 全部kill掉:
-
alter system kill session '2,1';
-
alter system kill session '69,1';
-
alter system kill session '70,3';
-
alter system kill session '71,7';
-
alter system kill session '76,443';
-
alter system kill session '126,3';
-
alter system kill session '131,1';
-
alter system kill session '134,9';
-
alter system kill session '192,1';
-
alter system kill session '3,1';
-
alter system kill session '4,3';
-
alter system kill session '5,1';
-
alter system kill session '125,1';
-
alter system kill session '6,1';
-
alter system kill session '67,1';
-
alter system kill session '127,3';
-
alter system kill session '190,1';
-
alter system kill session '66,1';
-
alter system kill session '128,1';
-
alter system kill session '129,1';
-
alter system kill session '144,3023';
-
alter system kill session '187,1';
-
alter system kill session '194,2149';
-
alter system kill session '1,1';
-
alter system kill session '189,1';
-
alter system kill session '196,3';
-
alter system kill session '7,3';
-
alter system kill session '132,11';
-
alter system kill session '193,1';
-
alter system kill session '197,6729';
-
alter system kill session '9,3';
-
alter system kill session '10,3';
-
alter system kill session '65,1';
-
alter system kill session '64,1';
-
alter system kill session '75,1567';
-
alter system kill session '188,1';
-
alter system kill session '191,1';
執行上面語句后去查詢表依然還是長時間不能出來結果,
且在v$session里查這些session都標記為killed了,然后就想到了到操作系統級別將這些session進程占用的資源徹底的給釋放掉,如下:
在linux下執行:
ps -aux|grep ora;
-
oracle 23485 0.0 0.2 3440784 22132 ? Ss 18:50 0:00 ora_pmon_cdzfrac1
-
oracle 23487 0.1 0.2 3440424 17600 ? Ss 18:50 0:00 ora_psp0_cdzfrac1
-
oracle 23489 1.6 0.2 3438356 17188 ? Ss 18:50 0:00 ora_vktm_cdzfrac1
-
oracle 23493 0.0 0.2 3440040 19592 ? Ss 18:50 0:00 ora_gen0_cdzfrac1
-
oracle 23495 0.1 0.3 3444520 25228 ? Ss 18:50 0:00 ora_diag_cdzfrac1
-
oracle 23497 0.1 0.3 3441960 28800 ? Ss 18:50 0:00 ora_dbrm_cdzfrac1
-
oracle 23499 0.0 0.2 3438356 18056 ? Ss 18:50 0:00 ora_ping_cdzfrac1
-
oracle 23501 0.0 0.2 3438356 17236 ? Ss 18:50 0:00 ora_acms_cdzfrac1
-
oracle 23503 0.2 0.3 3446568 31328 ? Ss 18:50 0:00 ora_dia0_cdzfrac1
-
oracle 23506 0.3 0.5 3452964 48656 ? Ss 18:50 0:00 ora_lmon_cdzfrac1
-
oracle 23508 1.9 0.4 3454660 39888 ? Ss 18:50 0:00 ora_lmd0_cdzfrac1
-
oracle 23510 1.0 1.2 3453268 100168 ? Ss 18:50 0:00 ora_lms0_cdzfrac1
-
oracle 23514 1.0 1.2 3453268 100380 ? Ss 18:50 0:00 ora_lms1_cdzfrac1
-
oracle 23518 0.0 0.2 3438356 18120 ? Ss 18:50 0:00 ora_rms0_cdzfrac1
-
oracle 23520 0.0 0.2 3438952 19564 ? Ss 18:50 0:00 ora_lmhb_cdzfrac1
-
oracle 23522 1.8 2.6 3438356 216396 ? Ss 18:50 0:00 ora_mman_cdzfrac1
-
oracle 23524 0.0 0.3 3449252 28544 ? Ss 18:50 0:00 ora_dbw0_cdzfrac1
-
oracle 23526 0.1 0.4 3464124 40288 ? Ss 18:50 0:00 ora_lgwr_cdzfrac1
-
oracle 23528 0.0 0.3 3442620 26648 ? Ss 18:50 0:00 ora_ckpt_cdzfrac1
-
oracle 23530 0.3 0.5 3441976 43860 ? Ss 18:50 0:00 ora_smon_cdzfrac1
-
oracle 23532 0.0 0.2 3438356 17476 ? Ss 18:50 0:00 ora_reco_cdzfrac1
-
oracle 23534 0.0 0.2 3441020 20968 ? Ss 18:50 0:00 ora_rbal_cdzfrac1
-
oracle 23536 0.0 0.2 3440236 23272 ? Ss 18:50 0:00 ora_asmb_cdzfrac1
-
oracle 23538 2.1 1.0 3446932 86268 ? Ss 18:50 0:00 ora_mmon_cdzfrac1
-
oracle 23542 0.0 0.2 3439588 23952 ? Ss 18:50 0:00 ora_mmnl_cdzfrac1
-
oracle 23544 0.0 0.2 3444612 17456 ? Ss 18:50 0:00 ora_d000_cdzfrac1
-
oracle 23546 0.0 0.3 3446068 25048 ? Ss 18:50 0:00 ora_mark_cdzfrac1
-
oracle 23548 0.0 0.1 3439552 16184 ? Ss 18:50 0:00 ora_s000_cdzfrac1
-
oracle 23550 0.1 0.2 3440236 21196 ? Ss 18:50 0:00 ora_ocf0_cdzfrac1
-
oracle 23554 2.2 0.4 3439464 35864 ? Ss 18:50 0:00 ora_lck0_cdzfrac1
-
oracle 23556 0.0 0.2 3444372 22148 ? Ss 18:50 0:00 ora_rsmn_cdzfrac1
-
oracle 23575 0.1 0.2 3439836 19432 ? Ss 18:50 0:00 ora_o000_cdzfrac1
-
oracle 23595 0.0 0.2 3438356 17464 ? Ss 18:50 0:00 ora_gtx0_cdzfrac1
-
oracle 23597 0.1 0.3 3438888 24540 ? Ss 18:50 0:00 ora_rcbg_cdzfrac1
-
oracle 23601 0.0 0.2 3438356 18248 ? Ss 18:50 0:00 ora_qmnc_cdzfrac1
-
oracle 23603 0.5 0.4 3445076 33124 ? Ss 18:50 0:00 ora_q000_cdzfrac1
-
oracle 23605 1.3 0.5 3445200 45316 ? Ss 18:50 0:00 ora_q001_cdzfrac1
-
oracle 23648 0.6 0.3 3439888 29068 ? Ss 18:50 0:00 ora_pz99_cdzfrac1
-
oracle 23662 4.2 0.5 3447084 46432 ? Ss 18:50 0:00 ora_cjq0_cdzfrac1
-
root 23663 0.0 0.0 110240 1176 pts/1 R+ 18:51 0:00 ps -aux
基本也分不清這都是什么,因為我們是RAC兩台服務器,害怕把所有oracle的進程關閉后,數據庫也癱了。
於是查了查,找spid對應的進程ID。
-
select distinct a.sid,b.SERIAL#,b.PROCESS,b.STATUS from v$session_wait a,v$session b
-
where a.SID=b.SID
找出來之后,全部kill掉。
kill -9 23662;
再去查詢表,結果很快就出來了.頓時覺得 這個世界又美好了一點。
后來看了一下,他們寫的程序,有一個后台線程,多次在執行掃數據的操作,一條報文的數據在2000條左右,一次更新2000條數據做的都是update操作,鎖表的情況很嚴重,導致session超時。好了,問題找着了,已經讓他們去重新寫這個程序了。
記錄一下此次檢查的工作,接下來好好想想,大批量的插入更新的整體架構設計,能不能用上並發等手段去解決他們的頻繁掃描插入更新表數據的情況。