版權聲明:原創做品,容許轉載,轉載時請務必以超連接形式標明文章
原始出處 、做者信息和本聲明。不然將追究法律責任。
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
10046是sql_trace的一個提高,它可以提供更爲詳細的信息
alter session set events '10046 trace name context forever, level xx';(必須確保timed_statistics爲true)
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上得到)
等級爲(1,4,8,12,0)---0爲關閉。
所跟蹤產生的文件爲被跟蹤session的tracefile.
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 gets從buffer 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語句EXECUTE的QUERY,CURRENT,ROWS分別爲2000 1000 500,表示這個語句訪問了2000個塊找到須要UPDATE的行記錄,在UPDATE的時候只訪問了1000個塊,一共更新了500行。若是隻獲取不多的數據,而要訪問了大量的塊,代表SQL與須要優化了。
MISSES 緩存命中率:0 表示已經經過軟分析
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;
|