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

首頁 > 數據庫 > Oracle > 正文

Oracle FAQ 之性能調整篇

2024-08-29 13:41:33
字體:
來源:轉載
供稿:網友

  [Q]假如設置自動跟蹤
  [A]用system登錄
  執行$Oracle_HOME/rdbms/admin/utlplan.sql創建計劃表
  執行$ORACLE_HOME/rdbms/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
  
  [Q]假如跟蹤自己的會話或者是別人的會話
  [A]跟蹤自己的會話很簡單
  Alter session set sql_trace truefalse
  Or
  Exec 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' 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
  
  
  [Q]怎么設置整個數據庫系統跟蹤
  [A]其實文檔上的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:包括綁定變量與等待事件
  
  [Q]怎么樣根據OS進程快速獲得DB進程信息與正在執行的語句
  [A]有些時候,我們在OS上操作,象TOP之后我們得到的OS進程,怎么快速根據OS信息獲得DB信息呢?
  我們可以編寫如下腳本:
  $more whoit.sh
  #!/bin/sh
  sqlplus /nolog <<EOF
  connect / as sysdba
  col machine format a30
  col program format a40
  set line 200
  select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss')
  from v/$session where paddr in
  ( select addr from v/$process where spid in($1));
  
  select sql_text from v/$sqltext_with_newlines
  where hash_value in
  (select SQL_HASH_VALUE from v/$session where
  paddr in (select addr from v/$process where spid=$1)
  )
  order by piece;
  
  exit;
  EOF
  然后,我們只要在OS環境下如下執行即可
  $./whoit.sh Spid
  
  [Q]怎么樣分析表或索引
  [A]命令行方式可以采用analyze命令
  如Analyze table tablename compute statistics;
  Analyze indexcluster indexname estimate statistics;
  ANALYZE TABLE tablename COMPUTE STATISTICS
  FOR TABLE
  FOR ALL [LOCAL] INDEXES
  FOR ALL [INDEXED] COLUMNS;
  ANALYZE TABLE tablename DELETE STATISTICS
  ANALYZE TABLE tablename VALIDATE REF UPDATE
  ANALYZE TABLE tablename VALIDATE STRUCTURE
  [CASCADE][INTO TableName]
  ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName]
  等等。

  假如想分析整個用戶或數據庫,還可以采用工具包,可以并行分析
  Dbms_utility(8i以前的工具包)
  Dbms_stats(8i以后提供的工具包)
  如
  dbms_stats.gather_schema_stats(User,estimate_percent=>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來收集信息。
  
  [Q]怎么樣快速重整索引
  [A]通過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
  消耗不大,對于有些索引中存在大量空間浪費的情況下,有一些作用。
  
  [Q]如何使用Hint提示
  [A] 在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就會被忽略;
  
  [Q]怎么樣快速復制表或者是插入數據
  [A]快速復制表可以指定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;
  
  [Q]怎么避免使用特定索引
  [A]在很多時候,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 t
  where a=? and b=? and c=? group by b
  
  [Q]Oracle什么時候會使用跳躍式索引掃描
  [A]這是9i的一個新特性跳躍式索引掃描(Index Skip Scan).
  例如表有索引index(a,b,c),當查詢條件為
  where b=?的時候,可能會使用到索引index(a,b,c)
  如,執行計劃中出現如下計劃:
  INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
  Oracle的優化器(這里指的是CBO)能對查詢應用Index Skip Scans至少要有幾個

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南充市| 乌拉特后旗| 江源县| 彝良县| 东兴市| 五河县| 神木县| 安化县| 河津市| 郓城县| 文安县| 长丰县| 社旗县| 揭西县| 广东省| 英山县| 登封市| 巴彦县| 娄烦县| 灵宝市| 潢川县| 镇巴县| 安平县| 安陆市| 阿拉善盟| 衡阳市| 普宁市| 广平县| 望都县| 抚松县| 阿图什市| 扬州市| 淮阳县| 庆安县| 保定市| 宜州市| 江永县| 华蓥市| 香河县| 镇江市| 禹城市|