oracle快速定位数据库瓶颈

oracle快速定位数据库瓶颈

--数据库巡检或性能优化方法各异,但首要的是要发现数据库性能瓶颈,系统自带的statspack,或awr太耗时.

  1. 查询数据库等待事件top10,关注前前几个等待事件,关注前三个等待事件是否有因果或关联关系--oracle 9i
    select t2.event,round(100t2.time_waited/(t1.w1+t3.cpu),2) event_wait_percent from (
    SELECT SUM(time_waited) w1 FROM v s y s t e m e v e n t W H E R E e v e n t N O T I N ( ′ s m o n t i m e r ′ , ′ p m o n t i m e r ′ , ′ r d b m s i p c m e s s a g e ′ , ′ N u l l e v e n t ′ , ′ p a r a l l e l q u e r y d e q u e u e ′ , ′ p i p e g e t ′ , ′ c l i e n t m e s s a g e ′ , ′ S Q L ∗ N e t m e s s a g e t o c l i e n t ′ , ′ S Q L ∗ N e t m e s s a g e f r o m c l i e n t ′ , ′ S Q L ∗ N e t m o r e d a t a f r o m c l i e n t ′ , ′ d i s p a t c h e r t i m e r ′ , ′ v i r t u a l c i r c u i t s t a t u s ′ , ′ l o c k m a n a g e r w a i t f o r r e m o t e m e s s a g e ′ , ′ P X I d l e W a i t ′ , ′ P X D e q : E x e c u t i o n M s g ′ , ′ P X D e q : T a b l e Q N o r m a l ′ , ′ w a k e u p t i m e m a n a g e r ′ , ′ s l a v e w a i t ′ , ′ i / o s l a v e w a i t ′ , ′ j o b q s l a v e w a i t ′ , ′ n u l l e v e n t ′ , ′ g c s r e m o t e m e s s a g e ′ , ′ g c s f o r a c t i o n ′ , ′ g e s r e m o t e m e s s a g e ′ , ′ q u e u e m e s s a g e s ′ ) ) t 1 , ( s e l e c t ∗ f r o m ( s e l e c t t . e v e n t , t . t o t a l w a i t s , t . t o t a l t i m e o u t s , t . t i m e w a i t e d , t . a v e r a g e w a i t , r o w n u m n u m f r o m ( s e l e c t e v e n t , t o t a l w a i t s , t o t a l t i m e o u t s , t i m e w a i t e d , a v e r a g e w a i t f r o m v system_event WHERE event NOT IN ('smon timer','pmon timer','rdbms ipc message','Null event','parallel query dequeue','pipe get', 'client message','SQL*Net message to client','SQL*Net message from client','SQL*Net more data from client', 'dispatcher timer','virtual circuit status','lock manager wait for remote message','PX Idle Wait', 'PX Deq: Execution Msg','PX Deq: Table Q Normal','wakeup time manager','slave wait','i/o slave wait', 'jobq slave wait','null event','gcs remote message','gcs for action','ges remote message','queue messages') ) t1, (select * from ( select t.event,t.total_waits,t.total_timeouts,t.time_waited,t.average_wait,rownum num from (select event,total_waits,total_timeouts,time_waited,average_wait from v systemeventWHEREeventNOTIN(′smontimer′,′pmontimer′,′rdbmsipcmessage′,′Nullevent′,′parallelquerydequeue′,′pipeget′,′clientmessage′,′SQL∗Netmessagetoclient′,′SQL∗Netmessagefromclient′,′SQL∗Netmoredatafromclient′,′dispatchertimer′,′virtualcircuitstatus′,′lockmanagerwaitforremotemessage′,′PXIdleWait′,′PXDeq:ExecutionMsg′,′PXDeq:TableQNormal′,′wakeuptimemanager′,′slavewait′,′i/oslavewait′,′jobqslavewait′,′nullevent′,′gcsremotemessage′,′gcsforaction′,′gesremotemessage′,′queuemessages′))t1,(select∗from(selectt.event,t.totalwaits,t.totaltimeouts,t.timewaited,t.averagewait,rownumnumfrom(selectevent,totalwaits,totaltimeouts,timewaited,averagewaitfromvsystem_event where event not in
    ('smon timer','pmon timer','rdbms ipc message','Null event','parallel query dequeue','pipe get',
    'client message','SQL
    Net message to client','SQLNet message from client','SQL Net more data from client', 'dispatcher timer','virtual circuit status','lock manager wait for remote message','PX Idle Wait',
    'PX Deq: Execution Msg','PX Deq: Table Q Normal','wakeup time manager','slave wait','i/o slave wait',
    'jobq slave wait','null event','gcs remote message','gcs for action','ges remote message','queue messages')
    order by time_waited desc ) t) where num<11) t2,
    (SELECT VALUE CPU FROM v$sysstat WHERE NAME LIKE 'CPU used by this session' ) t3

--oracle10g

select t2.event,round(100t2.time_waited/(t1.w1+t3.cpu),2) event_wait_percent from (
SELECT SUM(time_waited) w1 FROM v$system_event WHERE event NOT IN
('smon timer','pmon timer','rdbms ipc message','Null event','parallel query dequeue','pipe get','client message','SQL
Net message to client','SQL*Net message from

client','SQL*Net more data from client','dispatcher timer','virtual circuit status','lock manager wait for remote message','PX Idle Wait','PX Deq: Execution Msg','PX

Deq: Table Q Normal','wakeup time manager','slave wait',

'i/o slave wait','jobq slave wait','null event','gcs remote message','gcs for action','ges remote message','queue messages','wait for unread message on broadcast

channel','PX Deq Credit: send blkd','PX Deq: Execute Reply','PX Deq: Signal ACK','PX Deque wait','PX Deq Credit: need buffer','STREAMS apply coord waiting for slave

message',

'STREAMS apply slave waiting for coord message', 'Queue Monitor Wait', 'Queue Monitor Slave Wait', 'wakeup event for builder', 'wakeup event for preparer', 'wakeup

event for reader',

'wait for activate message', 'PX Deq: Par Recov Execute','PX Deq: Table Q Sample','STREAMS apply slave idle wait','STREAcapture process filter callback wait for

ruleset','STREAMS fetch slave waiting for txns',

'STREAMS waiting for subscribers to catch up','Queue Monitor Shutdown Wait','AQ Proxy Cleanup Wait','knlqdeq','class slave wait','master wait','DIAG idle wait',

'ASM background timer','KSV master wait','EMON idle wait','Streams AQ: RAC qmn coordinator idle wait','Streams AQ: qmn coordinator idle wait','Streams AQ: qmn slave

idle wait',

'Streams AQ: waiting for time management or cleanup tasks','Streams AQ: waiting for messages in the queue','Streams fetch slave: waiting for txns','Streams AQ:

deallocate messages from Streams Pool',

'Streams AQ: delete acknowledged messages','LNS ASYNC archive log','LNS ASYNC dest activation','LNS ASYNC end of log','LogMiner: client waiting for transaction',

'LogMiner: slave waiting for activate message','LogMiner: wakeup event for builder','LogMiner: wakeup event for preparer','LogMiner: wakeup event for reader') ) t1,

(select * from (

select t.event,t.total_waits,t.total_timeouts,t.time_waited,t.average_wait,rownum num from

(select event,total_waits,total_timeouts,time_waited,average_wait from v$system_event where event not in

('smon timer','pmon timer','rdbms ipc message','Null event','parallel query dequeue','pipe get','client message','SQLNet message to client','SQLNet message from

client','SQL*Net more data from client','dispatcher timer','virtual circuit status','lock manager wait for remote message','PX Idle Wait','PX Deq: Execution Msg','PX

Deq: Table Q Normal','wakeup time manager','slave wait',

'i/o slave wait','jobq slave wait','null event','gcs remote message','gcs for action','ges remote message','queue messages','wait for unread message on broadcast

channel','PX Deq Credit: send blkd','PX Deq: Execute Reply','PX Deq: Signal ACK','PX Deque wait','PX Deq Credit: need buffer','STREAMS apply coord waiting for slave

message',

'STREAMS apply slave waiting for coord message', 'Queue Monitor Wait', 'Queue Monitor Slave Wait', 'wakeup event for builder', 'wakeup event for preparer', 'wakeup

event for reader',

'wait for activate message', 'PX Deq: Par Recov Execute','PX Deq: Table Q Sample','STREAMS apply slave idle wait','STREAcapture process filter callback wait for

ruleset','STREAMS fetch slave waiting for txns',

'STREAMS waiting for subscribers to catch up','Queue Monitor Shutdown Wait','AQ Proxy Cleanup Wait','knlqdeq','class slave wait','master wait','DIAG idle wait',

'ASM background timer','KSV master wait','EMON idle wait','Streams AQ: RAC qmn coordinator idle wait','Streams AQ: qmn coordinator idle wait','Streams AQ: qmn slave

idle wait',

'Streams AQ: waiting for time management or cleanup tasks','Streams AQ: waiting for messages in the queue','Streams fetch slave: waiting for txns','Streams AQ:

deallocate messages from Streams Pool',

'Streams AQ: delete acknowledged messages','LNS ASYNC archive log','LNS ASYNC dest activation','LNS ASYNC end of log','LogMiner: client waiting for transaction',

'LogMiner: slave waiting for activate message','LogMiner: wakeup event for builder','LogMiner: wakeup event for preparer','LogMiner: wakeup event for reader')

order by time_waited desc ) t) where num<11) t2,

(SELECT VALUE CPU FROM v$sysstat WHERE NAME LIKE 'CPU used by this session' ) t3

--2、查询各种指标,根据各种指标反映的问题是否和等待事件有关联关系,进一步确定问题所在

--9i

select a.cache_hit_percent,e.rowcache_hitratio,d.pin_ration_percent,d.get_ratio_percent,

f.mem_sort_percent ,b.latch_ratio_percent from

(SELECT ROUND((1-((s1.VALUE-s4.VALUE-s5.VALUE)/(s2.VALUE+s3.VALUE-s4.VALUE-s5.VALUE)))*100,2) cache_hit_percent FROM v s y s s t a t s 1 , v sysstat s1, v sysstats1,vsysstat s2, v$sysstat s3,

v s y s s t a t s 4 , v sysstat s4, v sysstats4,vsysstat s5

WHERE s1.NAME='physical reads' AND s2.NAME='consistent gets'

AND s3.NAME='db block gets' AND s4.NAME='physical reads direct (lob)' AND s5.NAME='physical reads direct') a,

(select round(100*(1-sum(misses)/sum(gets)),2) latch_ratio_percent from v l a t c h ) b , ( s e l e c t r o u n d ( 100 ∗ c . p i n R A T I O / b . t o t a l , 2 ) p i n r a t i o n p e r c e n t , r o u n d ( 100 ∗ ( a . g e t r a t i o / b . t o t a l ) , 2 ) g e t r a t i o p e r c e n t f r o m ( s e l e c t s u m ( p i n h i t r a t i o ) p i n r a t i o f r o m v latch) b, (select round(100*c.pin_RATIO/b.total,2) pin_ration_percent, round(100*(a.get_ratio/b.total),2) get_ratio_percent from ( select sum(pinhitratio) pin_ratio from v latch)b,(selectround(100∗c.pinRATIO/b.total,2)pinrationpercent,round(100∗(a.getratio/b.total),2)getratiopercentfrom(selectsum(pinhitratio)pinratiofromvLIBRARYCACHE) c,(select sum(gethitratio) get_ratio from v L I B R A R Y C A C H E ) a , ( s e l e c t c o u n t ( ∗ ) t o t a l f r o m v LIBRARYCACHE) a, (select count(*) total from v LIBRARYCACHE)a,(selectcount(∗)totalfromvLIBRARYCACHE) b) d,(select round(100*(1-sum(getmisses)/sum(gets)),2) rowcache_hitratio from v r o w c a c h e ) e , ( S E L E C T r o u n d ( 100 ∗ s 1. V A L U E / ( s 2. V A L U E + s 1. V A L U E ) , 2 ) m e m s o r t p e r c e n t F R O M v rowcache ) e, (SELECT round(100*s1.VALUE/(s2.VALUE+s1.VALUE),2) mem_sort_percent FROM v rowcache)e,(SELECTround(100∗s1.VALUE/(s2.VALUE+s1.VALUE),2)memsortpercentFROMvsysstat s1 ,v$sysstat s2 WHERE s1.NAME='sorts (memory)' AND s2.NAME='sorts (disk)')f-- 10g

select a.cache_hit_percent,e.rowcache_hitratio,d.pin_ration_percent,d.get_ratio_percent,

f.mem_sort_percent ,b.latch_ratio_percent from

(SELECT ROUND((1-((s1.VALUE-s4.VALUE-s5.VALUE)/(s2.VALUE+s3.VALUE-s4.VALUE-s5.VALUE)))*100,2) cache_hit_percent FROM v s y s s t a t s 1 , v sysstat s1, v sysstats1,vsysstat s2, v$sysstat s3,

v s y s s t a t s 4 , v sysstat s4, v sysstats4,vsysstat s5

WHERE s1.NAME='physical reads' AND s2.NAME='consistent gets'

AND s3.NAME='db block gets' AND s4.NAME='physical reads direct (lob)' AND s5.NAME='physical reads direct') a,

(select round(100*(1-sum(misses)/sum(gets)),2) latch_ratio_percent from v l a t c h ) b , ( s e l e c t r o u n d ( 100 ∗ c . p i n R A T I O / b . t o t a l , 2 ) p i n r a t i o n p e r c e n t , r o u n d ( 100 ∗ ( a . g e t r a t i o / b . t o t a l ) , 2 ) g e t r a t i o p e r c e n t f r o m ( s e l e c t s u m ( p i n h i t r a t i o ) p i n r a t i o f r o m v latch) b, (select round(100*c.pin_RATIO/b.total,2) pin_ration_percent, round(100*(a.get_ratio/b.total),2) get_ratio_percent from ( select sum(pinhitratio) pin_ratio from v latch)b,(selectround(100∗c.pinRATIO/b.total,2)pinrationpercent,round(100∗(a.getratio/b.total),2)getratiopercentfrom(selectsum(pinhitratio)pinratiofromvLIBRARYCACHE) c,(select sum(gethitratio) get_ratio from v L I B R A R Y C A C H E ) a , ( s e l e c t c o u n t ( ∗ ) t o t a l f r o m v LIBRARYCACHE) a, (select count(*) total from v LIBRARYCACHE)a,(selectcount(∗)totalfromvLIBRARYCACHE) b) d,(select round(100*(1-sum(getmisses)/sum(gets)),2) rowcache_hitratio from v r o w c a c h e ) e , ( S E L E C T r o u n d ( 100 ∗ s 1. V A L U E / ( s 2. V A L U E + s 1. V A L U E ) , 2 ) m e m s o r t p e r c e n t F R O M v rowcache ) e, (SELECT round(100*s1.VALUE/(s2.VALUE+s1.VALUE),2) mem_sort_percent FROM v rowcache)e,(SELECTround(100∗s1.VALUE/(s2.VALUE+s1.VALUE),2)memsortpercentFROMvsysstat s1 ,v$sysstat s2 WHERE s1.NAME='sorts (memory)' AND s2.NAME='sorts (disk)')f

--3、产看内存配置,查看内存配置是否合理(结合查询到的各种指标,初步判断内存是否合理)

--9i

SELECT NAME,ROUND(VALUE/1024/1024) size_M FROM v$parameter WHERE NAME IN

('java_pool_size','large_pool_size','shared_pool_size','log_buffer','db_cache_size',

'pga_aggregate_target','sga_max_size','db_recycle_cache_size',

'db_keep_cache_size')

ORDER BY size_m DESC;--10g

select component,current_size/1024/1024 cur_size_M ,max_size/1024/1024

max_size_M from v$sga_dynamic_components

-- 4、查询三个top10sql语句,发现执行次数最多、内存、硬盘读取量大的sql,根据address查询在系统中的执行计划,是否需要进一步优化

select '硬盘读取量最大的top '||rownum t1_id,sql_disk_reads,disk_reads,address from (select sql_text sql_disk_reads ,disk_reads from v$sqlarea order by disk_reads desc)

where rownum<11

union all

select '高速缓冲区使用最大的top '||rownum t2_id ,sql_buffer_gets ,buffer_gets,address from (select sql_text sql_buffer_gets,buffer_gets from v$sqlarea order by

buffer_gets desc) where rownum<11

union all

select '执行次数最多的top '||rownum t3_id ,sql_executions ,executions,address from (select sql_text sql_executions,executions from v$sqlarea order by executions desc)

where rownum<11

--根据address查询在系统中的执行计划(真实执行计划),这个不同set autotrace on(这个是预执行计划,真实情况不一定,

--这也是很多时候我们执行很好,但实际效率较低不得其解的原因)

select lpad(' ', 2*(level-1))||operation||' '||decode(id, 0, 'Cost = '||position) "OPERATION",options, object_name

from v$sql_plan

start with (address ='' and id=0 )

connect by prior id = parent_id

and prior address = address

and prior hash_value = hash_value

and prior child_number = child_number

order by id, position ;

--5、查询系统运行较长的sql语句,该语句能将多数的耗费资源的sql抓取到

select q.sql_text,s.elapsed_seconds,s.start_time,s.opname from v s e s s i o n l o n g o p s s , v session_longops s, v sessionlongopss,vsqlarea q where s.sql_hash_value=q.hash_value order by s.ELAPSED_SECONDS desc;

--根据address查询在系统中的执行计划,是否需要优化

select lpad(' ', 2*(level-1))||operation||' '||decode(id, 0, 'Cost = '||position) "OPERATION",options, object_name

from v$sql_plan

start with (address ='' and id=0 )

connect by prior id = parent_id

and prior address = address

and prior hash_value = hash_value

and prior child_number = child_number

order by id, position ;

--6、找到需要优化的sql语句,尝试优化,查看执行计划(set autotrace traceonly),直到满意为止

--7、查看各个表空间的使用状况,注意收益率超过80%的表空间

SELECT tablespace_name,ROUND(used_percent,2) used_percent,ROUND(total_M,2) total_M,ROUND(used_M,2) used_M FROM (

SELECT d.tablespace_name , NVL(SUM(used_blocks),0)*8/1024 used_M,

SUM(blocks)*8/1024 total_m ,NVL(SUM(used_blocks),0)*100/SUM(blocks) used_percent

FROM v s o r t s e g m e n t v , d b a t e m p f i l e s d W H E R E d . t a b l e s p a c e n a m e = v . t a b l e s p a c e n a m e ( + ) G R O U P B Y d . t a b l e s p a c e n a m e U N I O N A L L S E L E C T t s . N A M E t a b l e s p a c e n a m e , t s . s i z e M − f s . s i z e M u s e d M , t s . s i z e M t o t a l M , ( t s . s i z e M − f s . s i z e M ) / t s . s i z e M ∗ 100 u s e d p e r c e n t F R O M ( S E L E C T t s . N A M E , S U M ( b y t e s ) / 1024 / 1024 s i z e M F R O M v sort_segment v ,dba_temp_files d WHERE d.tablespace_name=v.tablespace_name(+) GROUP BY d.tablespace_name UNION ALL SELECT ts.NAME tablespace_name, ts.size_M-fs.size_M used_M , ts.size_M total_M ,(ts.size_M-fs.size_M)/ts.size_M*100 used_percent FROM (SELECT ts.NAME ,SUM(bytes)/1024/1024 size_M FROM v sortsegmentv,dbatempfilesdWHEREd.tablespacename=v.tablespacename(+)GROUPBYd.tablespacenameUNIONALLSELECTts.NAMEtablespacename,ts.sizeM−fs.sizeMusedM,ts.sizeMtotalM,(ts.sizeM−fs.sizeM)/ts.sizeM∗100usedpercentFROM(SELECTts.NAME,SUM(bytes)/1024/1024sizeMFROMvdatafile df,v$tablespace ts WHERE df.ts#=ts.ts# GROUP BY ts.NAME ) ts , (SELECT tablespace_name ,SUM(bytes/1024/1024) size_M

FROM DBA_FREE_SPACE GROUP BY tablespace_name ) fs WHERE ts.NAME=fs.tablespace_name ) ORDER BY used_percent DESC;--8、查看最大的前10大字段(查看前10的最大字段),是不是耗费资源的sql都是和这些大段有关Select * from (Select segment_name,bytes/1024/1024

size_M,segment_type,tablespace_name from dba_segments order by bytes desc ) where rownum<11

相关推荐
爱学习的阿磊2 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha8 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞20 分钟前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
chian-ocean21 分钟前
CANN 生态进阶:利用 `profiling-tools` 优化模型性能
数据库·mysql
m0_5500246324 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
AC赳赳老秦25 分钟前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
啦啦啦_999939 分钟前
Redis-2-queryFormat()方法
数据库·redis·缓存
玄同7651 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码1 小时前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean2 小时前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer