DBA總結

版權聲明:原創做品,容許轉載,轉載時請務必以超連接形式標明文章  原始出處 、做者信息和本聲明。不然將追究法律責任。 http://johnnyfox.blog.51cto.com/1025246/259135
最近也工做一段時間了,發現俺仍是忠實的熱愛數據庫啊。
傳給我最近開始總結的數據庫經驗,歡迎你們多多捧場。
每週週末更新。如大家有問題能夠在個人bolg上留言。

1. 數據字典

1.1查詢數據字典。

d ictionary  ----- 該字典包含全部的字典信息
SQL>select * from dict where instr(comments,'index')>0;  ----- 查詢全部有關 index 的數據字典名稱。

1.2設置查詢結果格式。

Set heading on/off 打開 / 關閉查詢結果表頭的顯示 默認爲 ON
Set feedback on/off 打開 / 關閉查詢結果中返回行數的顯示 默認爲 ON
Set echo on/off 打開 / 關閉命令的回顯 默認爲 ON
Set time on/off 打開 / 關閉時間顯示 默認爲 OFF

2.系統I/O調整

2.1查詢磁盤I/O狀況。

#select d.tablespace_name tablespace,d.file_name,f.phyrds,f.phywrts
from v$filestat f,dba_data_files d
where f.file#=d.file_id;           ---------查詢數據文件的讀寫狀況
#db_file_multiblock_read_count    ---------一次性讀入塊的數量,能夠在session級別設置。
 

3. SQL調整

3.1 關於sql的初始化參數調整。

#cursor_sharing   -------是否會自動匹配變量參數| exact(徹底不會)------該參數若是不配合綁定變量會使得系統開銷很大| similar(智能匹配) -------推薦使用,但性能不如exact加綁定變量好|force(強制) -------會產生BUG|
#查看sqlarea中的sql語句來判定其sql所執行的次數(字段EXECUTIONS)。其動態性能視圖爲v$sqlarea

3.2 打開遊標和使用綁定變量的方法。

遊標:variable x refcursor  ----定義x爲一個遊標
      Begin
      Open :x for select XXXXXXX from XXXXXXXX;
      End;
      /
      (若是你想讀取遊標中的數,可使用print x)
綁定變量: sqlplus 中能夠這樣綁定
SQL> var n varchar2(30);
SQL>  exec :n := 'IM_USER';
PL/SQL  過程已成功完成。
SQL>  select * from tab where tname = :n;
TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
IM_USER                        SYNONYM

3.3 sql_trace使用。

#打開跟蹤文件
Alter session set sql_trace=true;
grant alter session to xxx---給予alter session
本身的跟蹤文件的位置(要使用下面的語句必須具備可查找動態性能視圖的權限)
select c.value||'/'||d.instance_name||'_ora_'||a.spid||'.trc' trace
from v$process a,v$session b,v$parameter c,v$instance d
where a.addr=b.paddr and b.audsid=userenv('sessionid') and c.name ='user_dump_dest';
跟蹤別人的跟蹤文件的位置
select c.value||'/'||d.instance_name||'_ora_'||a.spid||'.trc' trace
from v$process a,v$session b,v$parameter c,v$instance d
where a.addr=b.paddr and b.audsid=&a and c.name ='user_dump_dest';
b.audsid的值指定了所跟蹤的 session  能夠由 select SID,SERIAL#,AUDSID,username from v$session; 得出
#加標記
Alter  session  set  tracefile_identifier=’你想加的標記名’;
再打開跟蹤文件
#跟蹤別人的sql
若是跟蹤別人的會話,須要調用一個包  
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false) 
跟蹤的信息在user_dump_dest 目錄下能夠找到
 
能夠經過Tkprof來解析跟蹤文件,如
 
Tkprof 
原文件 目標文件 sys=n
 

3.4 10046tarce

10046sql_trace的一個提高,它可以提供更爲詳細的信息
alter session set events '10046 trace name context forever, level xx';(必須確保timed_statisticstrue
10046event的追蹤級別大體有:  
level 1
:跟蹤sql語句,包括解析、執行、提取、提交和回滾等。
 
level 4
:包括變量的周詳信息
 
level 8
:包括等待事件
 
level 12
:包括綁定變量和等待事件
關閉命令爲alter session set events '10046 trace name context off';
# 查看當前10046等級 11g貌似有問題,待研究)
Grant  execute on dbms_system to xxxxx;
 
set serveroutput on
declare i_event number;
begin
sys.dbms_system.read_ev(10046,i_event);
 dbms_output.put_line('the session sql_trace level is:'||i_event);
end;
 /
# 若是要監控別人的在擁有 dbms_system.set_ev 權限的用戶上運行
exec dbms_system.set_ev(SID,   SERIAL#,10046, 等級,'');SID, SERIAL#v$session上得到)
等級爲(148120---0爲關閉。
所跟蹤產生的文件爲被跟蹤sessiontracefile.

3.5關於sql的執行計劃。

SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE
只顯示優化器執行路徑報告  
SET AUTOTRACE ON STATISTICS -- 
只顯示執行統計信息

SET AUTOTRACE ON ----------------- 
包含執行計劃和統計信息  
SET AUTOTRACE TRACEONLY ------ 
set autotrace on,可是不顯示查詢輸出
SET AUTOTRACE TRACEONLY EXPLAIN  -----只顯示執行計劃,並不執行語句。
AUTOTRACE Statistics經常使用列解釋
db block gets    -----buffer cache中讀取的block的數量
consistent getsbuffer cache -----中讀取的undo數據的block的數量
physical reads -----從磁盤讀取的block的數量
redo size  ----- DML生成的redo的大小
sorts (memory) -----在內存執行的排序量
sorts (disk) -----在磁盤上執行的排序量

3.6 tkprof解讀

parse(分析):在共享池中找到該查詢(軟分析)或者建立該查詢的新計劃(硬分析)   
execute(執行):執行查詢的全部工做   
fetch(提取):顯示select的提取工做,對於update,則沒有內容   
count(計數):執行的次數   
cpu:此階段cpu的耗時,以毫秒爲單位   
elapsed(佔用時間):掛鐘時間,若是大於cpu時間,則有等待時間   
disk(磁盤):執行物理I/O的次數   
QUERY(查詢):檢索一致性執行的I/O次數   
CURRENT(當前):到當前多執行的邏輯I/O次數   
ROW:此階段被處理或者受到影響的行   
若是一個UPDATE語句EXECUTEQUERY,CURRENTROWS分別爲2000 1000 500,表示這個語句訪問了2000個塊找到須要UPDATE的行記錄,在UPDATE的時候只訪問了1000個塊,一共更新了500行。若是隻獲取不多的數據,而要訪問了大量的塊,代表SQL與須要優化了。   
MISSES 緩存命中率:表示已經經過軟分析   
OPTIMIZER GOAL(優化程序目標)   
 

3.7巧用rownum

記住rownum是僞例,他永遠從1開始,也就是說select xxxx from xxxxx where rownum>5這樣的是不可能產生結果的。那若是你必定要這麼作怎麼辦呢可使用
select * from (select rownum as rn,t.* from xxxx t) where rn>10
相關文章
相關標籤/搜索