sqlplus 跟蹤sql語句

netwant發表於2011-09-28
sqlplus 最耗資源sql語句跟蹤[@more@]這片文章主要是介紹怎樣檢視哪個客戶端的哪條sql語句最耗時。 transaction 有四個特性:ACID Atomicity 原子性 consistency 一致性 isolation 獨立性 durability 永續性 主要介紹從4個檢視裡找到最終的SQL. v$session v$transaction v$process v$sql 查有多少個使用者登入到資料庫: select sid,serial#,username,status from v$session where username is not null; 檢視資料伺服器上有哪些使用者連線上來: [root@ovt ~]# netstat -anp |more Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:718 0.0.0.0:* LISTEN 2232/rpc.statd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2192/portmap tcp 0 0 0.0.0.0:1523 0.0.0.0:* LISTEN 5331/tnslsnr tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2559/cupsd tcp 0 0 0.0.0.0:43225 0.0.0.0:* LISTEN 3014/ora_d000_ovt tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 5121/0 tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 5209/1 tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 5240/2 tcp 0 0 168.1.1.108:1523 168.1.1.108:6465 ESTABLISHED 5331/tnslsnr tcp 0 0 168.1.1.108:1523 168.1.1.65:4165 ESTABLISHED 5384/oracleovt tcp 0 0 168.1.1.108:1523 168.1.1.65:4177 ESTABLISHED 5389/oracleovt tcp 0 0 168.1.1.108:1523 168.1.1.65:4094 ESTABLISHED 5349/oracleovt tcp 0 0 168.1.1.108:6465 168.1.1.108:1523 ESTABLISHED 2982/ora_pmon_ovt 在客戶端機器(win)上檢視哪個程式連線伺服器: netstat -b 檢視庫裡有多少個transacation select addr,ses_addr from V$TRANSACTION 檢視多少個使用者連線進來 select sid,serial#,username,status from v$session; v$session中的sid 和 v$transaction 中的ses_addr是關聯的。 select sid,serial#,paddr,username,status from v$session; select addr,spid from v$process; v$process 中的 1、V$PROCESS.SPID---&gt NETSTAT 2、V$SESSION.PADDR--&gtV$PROCESS.ADDR 3、V$SESSION.SADDR--&gtV$TRANSACTION.SES_ADDR 4、V$SESSION.SQL_ADDRESS/PREV_SQL_ADDR--&gtV$SQL.ADDRESS&SQL_TEXT 先根據netstat pid值在V$PROCESS中找到ADDR, 然後根據ADDR--&gtPADDR對應關係, 找到ses_addr, select addr,ses_addr,xid from v$transaction; 聯合V$SESSION SELECT SADDR,SID,USERNAME,PADDR,STATUS FROM V$SESSION; SELECT ADDR,SPID FROM V$PROCESS; SPID 就能和netstat中的pid對應。 v$SESSION.SQL_ADDRESS --&gt v$SQL 小布的指令碼: select addr,ses_addr from v$transaction; select saddr,sid,serial#,username,status from v$session; select saddr,sid,serial#,username,status,prev_sql_addr,prev_hash_value from v$session; alter session set nls_date_format = 'YYYY-MM-DD HH:MI:SS'; select addr,sid,username,s.status,process,program from v$transaction t ,v$session s where t.ses_addr=s.saddr; select addr,pid,spid,program from v$process; select saddr,sid,paddr,username from v$porcess; select saddr,sid,paddr,username from v$session; select sql_text,address,hash_value from v$sql q,v$session s where s.prev_sql_addr=q.address and sid= 14; sid 是上個語句查詢出來的、 我自己改編合成一個語句: select count(*) from v$transaction; select sid,username,ses_addr,saddr,sql_hash_value,prev_sql_addr,sql_text from v$transaction t,v$session s,v$sql q where t.ses_addr=s.saddr and s.prev_sql_addr=q.address; select sid,username,ses_addr,saddr,sql_hash_value,prev_sql_addr,sql_text from v$transaction t,v$session s,v$sql q where t.ses_addr=s.saddr and s.sql_hash_value=q.hash_value;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/309902/viewspace-1055377/,如需轉載,請註明出處,否則將追究法律責任。

相關文章