国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

ORACLE學習筆記--性能優化一

2024-08-29 13:39:28
字體:
來源:轉載
供稿:網友
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-------------01  02  13  24  3
5  46  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  truefalseOrExec  dbms_session.set_sql_trace(TRUE); 假如跟蹤別人的會話,需要調用一個包exec  dbms_system.set_sql_trace_in_session(sid,serial#,truefalse) 跟蹤的信息在user_dump_dest  目錄下可以找到或通過如下腳本獲得文件名稱(適用于Win環境,假如是unix需要做一定修改)SELECT  p1.value“/“p2.value“_ora_“p.spid“.ora“  filenameFROMv$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.paddrAND  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=truelevel  4:包括變量的具體信息level  8:包括等待事件level  12:包括綁定變量與等待事件 5.怎么樣根據OS進程快速獲得DB進程信息與正在執行的語句 有些時候,我們在OS上操作,象TOP之后我們得到的OS進程,怎么快速根據OS信息獲得DB信息呢?我們可以編寫如下腳本:$more  whoit.sh#!/bin/shsqlplus  /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  offSQL>  set  feedback  offSQL>  spool  d:/index.sqlSQL>  SELECT  “alter  index  “    index_name    “  rebuild  ““tablespace  INDEXES  storage(initial  256K  next  256K  pctincrease  0);“FROM  all_indexesWHERE  (  tablespace_name  !=  “INDEXES“OR  next_extent  !=  (  256  *  1024  ))AND  owner  =  USERSQL>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  nologgingas  select  *  from  t2; 快速插入數據可以指定append提示,但是需要注重noarchivelog模式下,默認用了append就是nologging模式的。  在archivelog下,需要把表設置程Nologging模式。如insert  /*+  append  */  into  t1select  *  from  t2
 注重:假如在9i環境中并設置了FORCE  LOGGING,則以上操作是無效的,并不會加快,當然,可以通過如下語句設置為NO  FORCE  LOGGING。Alter  database  no  force  logging;是否開啟了FORCE  LOGGING,可以用如下語句查看SQL>  select  force_logging  from  v$database; 9.怎么避免使用特定索引 在很多時候,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提示,相信很多人沒有用過,也是一個不錯的方法:select  /*+  no_index(t,inx_b)  */  *  from  test  twhere  a=?  and  b=?  and  c=?  group  by  b 舉例: 本來在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是執行如下語句的時候很慢。select  *  from  CM_USER  where    acc_id  =1200007175
and  user_status>0  and  bill_id  like  “13%“  order  by  acc_id,bill_id 用explain分析,發現執行計劃是用IDX_CM_USER8.如下查詢select  *  from  user_indexes  where  table_name  =“CM_USER“  發現IDX_CM_USER8沒有分析過。 用下面語句執行計劃改變 select  /*+INDEX(CM_USER  IDX_CM_USER4)*/*  from  CM_USER  where    acc_id  =1200007175  and  user_status>0  and  bill_id  like  “13%“  order  by  acc_id,bill_id 或者分析索引exec  dbms_stats.gather_index_stats(ownname  =>  “QACS1“,indname  =>  “IDX_CM_USER8“,estimate_percent  =>  5  );可以發現執行計劃恢復正常。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 会理县| 通州市| 安塞县| 上栗县| 仙桃市| 松溪县| 山东省| 视频| 海伦市| 乐昌市| 封开县| 舟曲县| 郯城县| 莫力| 图片| 哈密市| 赤壁市| 双峰县| 辽阳县| 任丘市| 都匀市| 铜山县| 灌阳县| 牙克石市| 武冈市| 彭山县| 永清县| 定州市| 庆元县| 门头沟区| 金门县| 启东市| 甘谷县| 长顺县| 庆阳市| 伊川县| 江达县| 丰原市| 永善县| 曲麻莱县| 阿坝|