oracle statpack優化學習(1)

zhengbao_jun發表於2010-08-31

1、.什麼是STATSPACK,我怎麼使用它?
  Statspack是Oracle 8i以上提供的一個非常好的效能監控與診斷工具,基本上全部包含了BSTAT/ESTAT的功能,更多的資訊,可以參考附帶文件$ORACLE_HOME/rdbms/admin/spdoc.txt。

  安裝Statspack:
  cd $ORACLE_HOME/rdbms/admin
  sqlplus "/ as sysdba" @spdrop.sql -- 解除安裝,第一次可以不需要
  sqlplus "/ as sysdba" @spcreate.sql -- 需要根據提示輸入表空間名

  使用Statspack:
  sqlplus perfstat/perfstat
  exec statspack.snap; -- 進行資訊收集統計,每次執行都將產生一個快照號
  -- 獲得快照號,必須要有兩個以上的快照,才能生成報表
  select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
  @spreport.sql -- 輸入需要檢視的開始快照號與結束快照號

  其他相關指令碼s:
  spauto.sql - 利用dbms_job提交一個作業,自動的進行STATPACK的資訊收集統計
  sppurge.sql - 清除一段範圍內的統計資訊,需要提供開始快照與結束快照號
  sptrunc.sql - 清除(truncate)所有統計資訊


22. SQL語句的優化方法
  <1> /*+ALL_ROWS*/
  表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化.
  例如:
  SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

  <2>. /*+FIRST_ROWS*/
  表明對語句塊選擇基於開銷的優化方法,並獲得最佳響應時間,使資源消耗最小化.
  例如:
  SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE    EMP_NO='CCBZZP';

  <3>. /*+CHOOSE*/
  表明如果資料字典中有訪問表的統計資訊,將基於開銷的優化方法,並獲得最佳的吞吐量;
  表明如果資料字典中沒有訪問表的統計資訊,將基於規則開銷的優化方法;
  例如:
  SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

  <4>. /*+RULE*/
  表明對語句塊選擇基於規則的優化方法.
  例如:
  SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';  

  <5>. /*+FULL(TABLE)*/
  表明對錶選擇全域性掃描的方法.
  例如:
  SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='CCBZZP';

  <6>. /*+ROWID(TABLE)*/
  提示明確表明對指定表根據ROWID進行訪問.
  例如:
  SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
   AND EMP_NO='CCBZZP';

  <7>. /*+CLUSTER(TABLE)*/
  提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇物件有效.
  例如:
  SELECT  /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
  WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

  <8>. /*+INDEX(TABLE INDEX_NAME)*/
  表明對錶選擇索引的掃描方法.
  例如:
  SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE    BSEMPMS */  FROM BSEMPMS WHERE SEX='M';

  <9>. /*+INDEX_ASC(TABLE INDEX_NAME)*/
  表明對錶選擇索引升序的掃描方法.
  例如:
  SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */  FROM BSEMPMS WHERE DPT_NO='CCBZZP';

  <10>. /*+INDEX_COMBINE*/
  為指定表選擇點陣圖訪問路經,如果INDEX_COMBINE中沒有提供作為引數的索引,將選擇出點陣圖索引的
  布林組合方式.
  例如:
  SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
  WHERE SAL<5000000 AND HIREDATE

  <11>. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
  提示明確命令優化器使用索引作為訪問路徑.
  例如:
  SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
  FROM BSEMPMS WHERE SAL<60000;

  <12>. /*+INDEX_DESC(TABLE INDEX_NAME)*/
  表明對錶選擇索引降序的掃描方法.
  例如:
  SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */  FROM BSEMPMS WHERE    DPT_NO='CCBZZP';

  <13>. /*+INDEX_FFS(TABLE INDEX_NAME)*/
  對指定的表執行快速全索引掃描,而不是全表掃描的辦法.
  例如:
  SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TE**';

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/235507/viewspace-672253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章