㈠ Oracle資料庫伺服器CPU一直100%怎麼辦
topas/top 看下是不是oracle進程佔用的cpu。
然後查看下oracle資料庫中都在跑哪些語句。
多數都是效率較差的sql語句導致cpu使用率過高的,一般通過優化sql即可解決。
可用如下語句查看哪些執行時間較長的sql:
Select b.USERNAME,
b.SID,
a.SQL_ID,
a.SQL_TEXT,
a.sql_fulltext,
b.EVENT,
a.executions,
-- trunc(((decode(a.EXECUTIONS,0,0,a.cpu_time / a.executions)) / 10000)) c_time, ---單位零點秒
trunc(((decode(a.EXECUTIONS,0,0,a.ELAPSED_TIME / a.executions)) / 10000)) e_time,
--trunc(cpu_time/10000) cpu_time,
trunc(a.ELAPSED_TIME/10000) ELAPSED_TIME ,
a.DISK_READS,
a.BUFFER_GETS,
b.MACHINE,
b.PROGRAM
From v$sqlarea a, v$session b
Where executions > =0
And b.status = 'ACTIVE'
and a.SQL_ID = b.SQL_ID
-- and b.USERNAME='DB_WTDZ'
-- and trunc(((a.cpu_time / a.executions) / 1000000))>5
Order By e_time desc
㈡ Oracle內存和CPU佔用率極高,是什麼問題
問題分析:
一般cpu佔用效高都是排序、sql解析和全表掃描,這里首先需要找出佔用cpu最高的sql,然後查看他的執行計劃,比如:看執行計劃是走索引還是全表掃描(剛開始查看top發現佔用同樣多的CPU的進程很多,還以為是oracle 的bug, 後來發現不是)。
處理過程:
1, 根據操作系統進程查找Oracle資料庫中佔用最多CPU的SQL
使用Linux系統 "top命令->P "查出佔用cpu最高的進程PID
操作如下:在sqlplus中執行如下sql:
SQL>
SELECT
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr =
(SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC
其中&pid 是使用top 查看系統中進程佔用CPU極高的PID
找到SQL語句進行相應的調整優化
2,分析找到的sql語句,如查看sql執行計劃。
㈢ 在oracle中如何查找io調用最多的sql
有很多種方法可以用來找出哪些SQL語句需要優化,但是很久以來,最簡單的方法都是分析保存在V$SQL視圖中的緩存的SQL信息。通過V$SQL視圖,可以確定具有高消耗時間、CUP和IO讀取的SQL語句。
1.查看總消耗時間最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
2.查看CPU消耗時間最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
3.查看消耗磁碟讀取最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
希望能幫到您!
㈣ 如何用sql 語句查詢出oracle的cpu使用率
select * from (select sql_text,sql_id,cpu_time from v$sql order by cpu_time desc) where rownum<=10 order by rownum asc ;
select * from (select sql_text,sql_id,cpu_time from v$sqlarea order by cpu_time desc) where rownum<=10 order by rownum asc ;
㈤ oracle如何定位效率較低的sql
oracle中看效率低的sql,其實是沒有的;
只有看資源消耗高的sql,因為即使這個sql語句效率低,但是運行次數過少,或總體消耗並不算大,還是對系統沒有多大妨礙的。
通過awr的各種排序(cpu,elapsed time,buffer),找出高消耗的sql語句,再通過awrsqrpt進行分析,到底問題出在什麼地方
㈥ 如何定位佔用oracle資料庫cpu過高的sql
ORACLE查詢當前執行效率低的sqlx0dx0a--CPU高的SQLx0dx0aselect sql_text from v$sql order by cpu_time descx0dx0a--邏輯讀多的SQL:x0dx0aselect * from (select buffer_gets, sql_textx0dx0afrom v$sqlareax0dx0awhere buffer_gets > 500000x0dx0aorder by buffer_gets desc) where rownum<=30;x0dx0a--執行次數多的SQL :x0dx0aselect sql_text,executions fromx0dx0a(select sql_text,executions from v$sqlarea order by executions desc)x0dx0awhere rownum<81;x0dx0a--讀硬碟多的SQL :x0dx0aselect sql_text,disk_reads fromx0dx0a(select sql_text,disk_reads from v$sqlarea order by disk_reads desc)x0dx0awhere rownum<21;
㈦ oracle佔用cpu過高 怎麼處理
這個沒辦法處理優化,只能是提高電腦配置,或者是換其他版本的oracle,建議使用10g。
解釋:oracle運行程序本身就比較占內存,並且要啟動三個實例才可以運行,所以建議可以更換個大的內存條(最少4G),安裝64位系統。
備註:建議不用oracle的情況下可以把oracle的進程都停掉,減少內存佔用。
㈧ oracle資料庫經常會出現佔用cpu100%的進程,然後系統就掛了,怎麼找出引起這種故障的sql語句
在故障發生時,嘗試用下面的語句抓取資料庫引起故障的點。
/*********************************************************************************************/
在oracle中監控死鎖
/*********************************************************************************************/
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE(m.lmode,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
lmode,
LTRIM(TO_CHAR(lmode, '990'))) lmode,
DECODE(m.request,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
request,
LTRIM(TO_CHAR(m.request, '990'))) request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞
OR (sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定
AND m.request = 0 AND lmode != 4 AND
(id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request;
/*********************************************************************************************/
定位引起oracle死鎖的sql
/*********************************************************************************************/
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
/*********************************************************************************************/
下面的SQL查詢可以用於確定鎖住資料庫對象的鎖:
/*********************************************************************************************/
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id;
/*********************************************************************************************/
顯示哪些會話被鎖住
/*********************************************************************************************/
/* showlock.sql */
COLUMN o_name format a10
COLUMN lock_type format a20
COLUMN object_name format a15
SELECT RPAD (oracle_username, 10) o_name, session_id SID,
DECODE (locked_mode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Execlusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
object_name, xisn, xidslot, xidsqn
FROM v$locked_object, all_objects
WHERE v$locked_object.object_id = all_objects.object_id;
/*********************************************************************************************/
顯示所有的TM和TX鎖
/*********************************************************************************************/
/* showalllock.sql */
SELECT SID, TYPE, id1, id2,
DECODE (lmode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Exclusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
request, ctime, BLOCK
FROM v$lock
WHERE TYPE IN ('TX', 'TM');
/*********************************************************************************************/
在Oracle資料庫中,可以通過kill session的方式來終止一個進程,其基本語法結構為:
被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.
我們發現當一個session被kill掉以後,該session的paddr被修改,如果有多個session被kill,那麼多個session
的paddr都被更改為相同的進程地址:
/*********************************************************************************************/
alter system kill session 'sid,serial#' ;
/*********************************************************************************************/
在oracle中kill掉的進程有時還需要等待pmon回滾資料庫已經佔有的資源
有時候我們需要使用下面的腳本找出那些已經在oracle中kill掉的進程,在操作系統中在kill一次
/*********************************************************************************************/
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s;
$ kill -9 &paddr
㈨ 如何查詢佔CPU高的oracle進程
oracle佔用cpu過高怎麼處理,本文將介紹有關oracle進程CPU佔用率過高的問題,需要了解跟多的朋友可以參考下
1:首先使用TOP命令傳到佔用CPU高的SPID號
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
3575 oracle 1 12 0 0K 0K run 748.6H 24.98% oracle
3571 oracle 1 22 0 0K 0K sleep 706.2H 22.84% oracle
2:使用DBA賬戶登錄資料庫,使用以下SQL語句查詢:
SELECT * FROM V$PROCESS WHERE spid=3575;查詢到SQL相關信息
3:根據以上查詢到的信息使用以下SQL查詢:
SELECT sid, program FROM V$SESSION S WHERE EXISTS(SELECT 1 FROM V$PROCESS WHERE spid=3575 AND ADDR = S.PADDR);
可以查詢到具體那個客戶端查詢一直在不斷佔用ORACLE資源!
最後對這個查詢進行處理!
4.根據SID查得SQLITPUB
復制代碼代碼如下:
select sql_textITPUB
from v$sqltext
where a.hashvalue=(select sql_hash_value
from v$session b
where b.SID='&sid')
0order by piece ASC;
根據lockwait欄位可以查詢當前正在等待的鎖的相關信息:
復制代碼代碼如下:
select * from v$lock where kaddr in (select lockwait from v$session where sid= $sid);
(sql_address,sql_hash_value),(prev_sql_addr,prev_hash_value) 根據這兩組欄位, 可以查詢到當前session正在執行的或最近一次執行的sql語句的詳細信息:
select * from v$sqltext where address = &sql_address and hash_value = &sql_hash_value;
根據PID查SQL相關信息:
復制代碼代碼如下:
select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') logon from v$session where paddr in ( select addr from v$process where spid in('&pid'));
根據PID查SQL語句
復制代碼代碼如下:
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text FROM v$session a,v$process b,v$sqltext c WHERE b.spid='&spid' AND b.addr=a.paddr AND a.sql_address=c.address(+) ORDER BY c.piece;
得到進程的sid號:
復制代碼代碼如下:
select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') logon from v$session where paddr in ( select addr from v$process where spid in('&pid'));
得到session的sqltext語句:
復制代碼代碼如下:
select sql_text from v$sqltext_with_newlines where hash_value in (select SQL_HASH_VALUE from v$session where paddr in (select addr from v$process where spid= '&pid')) order by piece;