Posted on 2006-04-16 17:47
Kerwin Weng 閱讀(219)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Oracle
信息系統(tǒng)訪(fǎng)問(wèn)量又不大,瓶頸一般不會(huì)出現(xiàn)在應(yīng)用層,極有可能在數(shù)據(jù)庫(kù)這一層,不用急著看程序。先找出邏輯讀取次數(shù)最多的SQL,硬盤(pán)讀取次數(shù)最多的SQL,找到SQL,對(duì)于SQL進(jìn)行優(yōu)化。看看有沒(méi)有發(fā)生全表掃描的地方。
一般發(fā)生全表掃描,極有可能是沒(méi)有建立合理的索引,或者索引由于左邊引用函數(shù)或其它原因造成索引失效。
對(duì)于運(yùn)行一年多的系統(tǒng),最好要自己寫(xiě)一個(gè)自動(dòng)重建索引的程序,定時(shí)重建索引。
或者使用TOAD工具幫你重建索引。
另外在看一下數(shù)據(jù)庫(kù)的CPU占用率,如果占用率在經(jīng)常在80%-100%,那一定要是SQL或存儲(chǔ)過(guò)程及trigger中寫(xiě)的不好。
不需要從應(yīng)用層找SQL,方向性錯(cuò)誤,太累,也看不出效果。
而應(yīng)當(dāng)使用pl/SQL, toad等工具,分析出最bad的SQL語(yǔ)句,一看到這些語(yǔ)句后,再修改應(yīng)用層的查詢(xún)就是了。又快又方便。
?
-- 邏輯讀多的SQL
select * from (select buffer_gets, sql_text
from v$sqlarea
where buffer_gets > 500000
order by buffer_gets desc) where rownum<=30;
-- 執(zhí)行次數(shù)多的SQL
select sql_text,executions from
(select sql_text,executions from v$sqlarea order by executions desc)
where rownum<81;
-- 讀硬盤(pán)多的SQL
select sql_text,disk_reads from
(select sql_text,disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;
-- 排序多的SQL
select sql_text,sorts from
(select sql_text,sorts from v$sqlarea order by sorts desc)
where rownum<21;
--分析的次數(shù)太多,執(zhí)行的次數(shù)太少,要用綁變量的方法來(lái)寫(xiě)sql
set pagesize 600;
set linesize 120;
select substr(sql_text,1,80) "sql", count(*), sum(executions) "totexecs"
from v$sqlarea
where executions < 5
group by substr(sql_text,1,80)
having count(*) > 30
order by 2;
轉(zhuǎn)載地址?http://forum.javaeye.com/viewtopic.php?t=19464