強烈推薦:ORACLE學習筆記--效能優化(ZT)
在IXDBA看到的很不錯的記錄,特轉載過來,以後要常來看看!
包括:
1. 查詢正在執行語句的執行計劃(也就是實際語句執行計劃)
2.如何設定自動跟蹤
3.如何跟蹤自己的會話或者是別人的會話
4.怎麼設定整個資料庫系統跟蹤
5.怎麼樣根據OS程式快速獲得DB程式資訊與正在執行的語句
6.怎麼樣快速重整索引
7.如何使用Hint提示
8.怎麼樣快速複製表或者是插入資料
10.Oracle什麼時候會使用跳躍式索引掃描
11.怎麼樣建立使用虛擬索引 12.怎樣監控無用的索引
13.怎麼樣能固定我的執行計劃
14.v$sysstat中的class分別代表什麼
15.怎麼殺掉特定的資料庫會話
16.怎麼快速查詢鎖與鎖等待
17.如何收縮臨時資料檔案的大小
18.怎麼清理臨時段
19.怎麼樣dump資料庫內部結構,如上面顯示的控制檔案的結構
20.如何獲得所有的事件程式碼
1. 查詢正在執行語句的執行計劃(也就是實際語句執行計劃)
select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);
其中id和parent_id表示了執行數的結構,數值最大的為最先執行比如
ID PARENT_ID
-------------
0
1 0
2 1
3 2
4 3
5 4
6 3
則執行計劃樹為
0
1
2
3
6 4
5
2.如何設定自動跟蹤
用system登入
執行$ORACLE_HOME/rdbms/admin/utlxplan.sql建立計劃表
執行$ORACLE_HOME/sqlplus/admin/plustrce.sql建立plustrace角色
如果想計劃表讓每個使用者都能使用,則
SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果想讓自動跟蹤的角色讓每個使用者都能使用,則
SQL> grant plustrace to public;
通過如下語句開啟/停止跟蹤
SET AUTOTRACE
ON |OFF | ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
3.如何跟蹤自己的會話或者是別人的會話
跟蹤自己的會話很簡單
Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);
如果跟蹤別人的會話,需要呼叫一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟蹤的資訊在user_dump_dest 目錄下可以找到或通過如下指令碼獲得檔名稱(適用於Win環境,如果是unix需要做一定修改)
SELECT p1.value||''||p2.value||'_ora_'||p.spid||'.ora' filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID')
最後,可以通過tkprof來解析跟蹤檔案,如
tkprof 原檔案 目標檔案 sys=n
4.怎麼設定整個資料庫系統跟蹤
其實文件上的alter system set sql_trace=true是不成功的,但是可以通過設定事件來完成這個工作,作用相等
alter system set events
'10046 trace name context forever,level 1';
如果關閉跟蹤,可以用如下語句
alter system set events
'10046 trace name context off';
其中的level 1與上面的8都是跟蹤級別
level 1:跟蹤SQL語句,等於sql_trace=true
level 4:包括變數的詳細資訊
level 8:包括等待事件
level 12:包括繫結變數與等待事件
5.怎麼樣根據OS程式快速獲得DB程式資訊與正在執行的語句有些時候,我們在OS上操作,象TOP之後我們得到的OS程式,怎麼快速根據OS資訊獲得DB資訊呢?我們可以編寫如下指令碼:$more whoit.sh
#!/bin/sh
sqlplus /nolog 100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
這是對命令與工具包的一些總結
<1>、對於分割槽表,建議使用DBMS_STATS,而不是使用Analyze語句。 a) 可以並行進行,對多個使用者,多個Table b) 可以得到整個分割槽表的資料和單個分割槽的資料。 c) 可以在不同級別上Compute Statistics:單個分割槽,子分割槽,全表,所有分割槽 d) 可以倒出統計資訊 e) 可以使用者自動收集統計資訊
<2>、DBMS_STATS的缺點 a) 不能Validate Structure b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的資訊,這兩個仍舊需要使用Analyze語句。 c) DBMS_STATS 預設不對索引進行Analyze,因為預設Cascade是False,需要手工指定為True
<3>、對於oracle 9裡面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集資訊。
6.怎麼樣快速重整索引通過rebuild語句,可以快速重整或移動索引到別的表空間
rebuild有重建整個索引數的功能,可以在不刪除原始索引的情況下改變索引的儲存引數語法為alter index index_name rebuild tablespace ts_name
storage(......);
如果要快速重建整個使用者下的索引,可以用如下指令碼,當然,需要根據你自己的情況做相應修改SQL> set heading off
SQL> set feedback off
SQL> spool d:index.sql
SQL> SELECT 'alter index ' || index_name || ' rebuild '
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 )
)
AND owner = USER
SQL>spool off
另外一個合併索引的語句是
alter index index_name coalesce
這個語句僅僅是合併索引中同一級的leaf block,消耗不大,對於有些索引中存在大量空間浪費的情況下,有一些作用。
7.如何使用Hint提示在select/delete/update後寫/*+ hint */如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*和+之間不能有空格,如用hint指定使用某個索引select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
select /*+ index(a cbotab1) */ col1 from cbotab a;
其中
TABLE_NAME是必須要寫的,且如果在查詢中使用了表的別名,在hint也要用表的別名來代替表名;
INDEX_NAME可以不必寫,Oracle會根據統計值選一個索引;如果索引名或表名寫錯了,那這個hint就會被忽略;
8.怎麼樣快速複製表或者是插入資料快速複製表可以指定Nologging選項如:Create table t1 nologging
as select * from t2;
快速插入資料可以指定append提示,但是需要注意noarchivelog模式下,預設用了append就是nologging模式的。 在archivelog下,需要把表設定程Nologging模式。如insert /*+ append */ into t1
select * from t2
注意:如果在9i環境中並設定了FORCE LOGGING,則以上操作是無效的,並不會加快,當然,可以通過如下語句設定為NO FORCE LOGGING。Alter database no force logging;是否開啟了FORCE LOGGING,可以用如下語句檢視SQL> select force_logging from v$database;
在很多時候,Oracle會錯誤的使用索引而導致效率的明顯下降,我們可以使用一點點技巧而避免使用不該使用的索引,如:表test,有欄位a,b,c,d,在a,b,c上建立聯合索引inx_a(a,b,c),在b上單獨建立了一個索引Inx_b(b)。
在正常情況下,where a=? and b=? and c=?會用到索引inx_a,where b=?會用到索引inx_b,但是,where a=? and b=? and c=? group by b會用到哪個索引呢?在分析資料不正確(很長時間沒有分析)或根本沒有分析資料的情況下,oracle往往會使用索引inx_b。通過執行計劃的分析,這個索引的使用,將大大耗費查詢時間。
當然,我們可以通過如下的技巧避免使用inx_b,而使用inx_a。
where a=? and b=? and c=? group by b||'' --如果b是字元
where a=? and b=? and c=? group by b+0 --如果b是數字
通過這樣簡單的改變,往往可以是查詢時間提交很多倍當然,我們也可以使用no_index提示,相信很多人沒有用過,也是一個不錯的方法:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1000485/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 強烈推薦Python新手學習之——字典Python
- 機器學習知識體系 (強烈推薦)機器學習
- SYBASE學習筆記(zt)筆記
- 強烈推薦的軟體
- 一文深入淺出學習Spring框架系列,強烈推薦Spring框架
- Nginx效能優化(學習筆記二十五)Nginx優化筆記
- 強化學習筆記強化學習筆記
- 強烈推薦的 Chrome 外掛Chrome
- 強化學習-學習筆記13 | 多智慧體強化學習強化學習筆記智慧體
- 強烈推薦:GitHub 上 13 個 Python 學習資源|Python 主題月GithubPython
- 強化學習-學習筆記5 | AlphaGo強化學習筆記Go
- 斜率優化學習筆記優化筆記
- 強化學習-學習筆記7 | Sarsa演算法原理與推導強化學習筆記演算法
- 強化學習-學習筆記3 | 策略學習強化學習筆記
- 強烈推薦各類好用免費apiAPI
- 【推薦】Java效能優化系列集錦Java優化
- 推薦:Java效能優化系列集錦Java優化
- 強化學習-學習筆記12 | Dueling Network強化學習筆記
- 強化學習-學習筆記2 | 價值學習強化學習筆記
- Android效能優化 筆記Android優化筆記
- Linux 效能優化筆記Linux優化筆記
- Web 效能優化筆記Web優化筆記
- Mysql 優化(學習筆記二十)MySql優化筆記
- Flink + 強化學習 搭建實時推薦系統強化學習
- 【強烈推薦】可能是最適合你的 Java 學習路線和方法Java
- 強烈推薦的幾個Android studio外掛Android
- 強化學習-學習筆記15 | 連續控制強化學習筆記
- 強化學習-學習筆記8 | Q-learning強化學習筆記
- 強化學習-學習筆記10 | 經驗回放強化學習筆記
- 強化學習-學習筆記1 | 基礎概念強化學習筆記
- 強化學習-學習筆記4 | Actor-Critic強化學習筆記
- .net下優秀的日誌框架Serilog,你用上了嗎?強烈推薦框架
- 強烈推薦| 工程化必備的幾個 Python 開發工具Python
- MySQL優化學習筆記之explainMySql優化筆記AI
- MySQL優化學習筆記之索引MySql優化筆記索引
- Android卡頓優化學習筆記Android優化筆記
- 強烈推薦的各種熱門好用的介面
- Google 出品的 Java 編碼規範,強烈推薦!GoJava
- 新手推薦,前端效能優化小整理,效率加倍前端優化