1. 程式人生 > >Oracle 重建索引指令碼

Oracle 重建索引指令碼

      索引是提高資料庫查詢效能的有力武器。沒有索引,就好比圖書館沒有圖書標籤一樣,找一本書自己想要的書比登天還難。然而索引在使用的過程中,尤其是在批量的DML的情形下會產生相應的碎片,以及B樹高度會發生相應變化,因此可以對這些變化較大的索引進行重構以提高效能。N久以前Oracle建議我們定期重建那些高度為4,已刪除的索引條目至少佔有現有索引條目總數的20%的這些表上的索引。但Oracle現在強烈建議不要定期重建索引。具體可以參考文章:Oracle 重建索引的必要性。儘管如此重建索引還是有必要的,只是不建議定期。本文給出了重建索引的指令碼供大家參考。
 
1、重建索引shell指令碼

[email protected]
:~/dba_scripts/custom/bin> more rebuild_unbalanced_indices.sh # +-------------------------------------------------------+ # + Rebulid unblanced indices | # + Author : Leshami | # + Parameter : No | # + Blog : http://blog.csdn.net/leshami | # +-------------------------------------------------------+ #!/bin/bash # -------------------- # Define variable # -------------------- if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi DT=`date +%Y%m%d`; export DT RETENTION=1 LOG_DIR=/tmp LOG=${LOG_DIR}/rebuild_unbalanced_indices_${DT}.log
[email protected]
# ------------------------------------ # Loop all instance in current server # ------------------------------------- echo "Current date and time is : `/bin/date`">>${LOG} for db in `ps -ef | grep pmon | grep -v grep |grep -v asm |awk '{print $8}'|cut -c 10-` do echo "$db" export ORACLE_SID=$db echo "Current DB is $db" >>${LOG} echo "===============================================">>${LOG} $ORACLE_HOME/bin/sqlplus -S /nolog @/users/robin/dba_scripts/custom/sql/rebuild_unbalanced_indices.sql>>${LOG} done; echo "End of rebuilding index for all instance at : `/bin/date`">>${LOG} # ------------------------------------- # Check log file # ------------------------------------- status=`grep "ORA-" ${LOG}` if [ -z $status ];then mail -s "Succeeded rebuilding indices on `hostname` !!!" ${DBA} <${LOG} else mail -s "Failed rebuilding indices on `hostname` !!!" ${DBA} <${LOG} fi # ------------------------------------------------ # Removing files older than $RETENTION parameter # ------------------------------------------------ find ${LOG_DIR} -name "rebuild_unb*" -mtime +$RETENTION -exec rm {} \; exit


2、重建索引呼叫的SQL指令碼

[email protected]:~/dba_scripts/custom/sql> more rebuild_unbalanced_indices.sql 
conn / as sysdba
set serveroutput on;
DECLARE
   resource_busy               EXCEPTION;
   PRAGMA EXCEPTION_INIT (resource_busy, -54);
   c_max_trial        CONSTANT PLS_INTEGER := 10;
   c_trial_interval   CONSTANT PLS_INTEGER := 1;
   pmaxheight         CONSTANT INTEGER := 3;
   pmaxleafsdeleted   CONSTANT INTEGER := 20;

   CURSOR csrindexstats
   IS
      SELECT NAME,
             height,
             lf_rows AS leafrows,
             del_lf_rows AS leafrowsdeleted
        FROM index_stats;

   vindexstats                 csrindexstats%ROWTYPE;

   CURSOR csrglobalindexes
   IS
      SELECT owner,index_name, tablespace_name
        FROM dba_indexes
       WHERE partitioned = 'NO'
        AND owner IN ('GX_ADMIN');

   CURSOR csrlocalindexes
   IS
      SELECT index_owner,index_name, partition_name, tablespace_name
        FROM dba_ind_partitions
       WHERE status = 'USABLE'
        AND index_owner IN ('GX_ADMIN');

   trial                       PLS_INTEGER;
   vcount                      INTEGER := 0;
BEGIN
   trial := 0;

   /* Global indexes */
   FOR vindexrec IN csrglobalindexes
   LOOP
      EXECUTE IMMEDIATE
         'analyze index ' || vindexrec.owner ||'.'|| vindexrec.index_name || ' validate structure';

      OPEN csrindexstats;

      FETCH csrindexstats INTO vindexstats;

      IF csrindexstats%FOUND
      THEN
         IF    (vindexstats.height > pmaxheight)
            OR (    vindexstats.leafrows > 0
                AND vindexstats.leafrowsdeleted > 0
                AND (vindexstats.leafrowsdeleted * 100 / vindexstats.leafrows) >
                       pmaxleafsdeleted)
         THEN
            vcount := vcount + 1;
            DBMS_OUTPUT.PUT_LINE (
               'Rebuilding index ' || vindexrec.owner ||'.'|| vindexrec.index_name || '...');

           <<alter_index>>
            BEGIN
               EXECUTE IMMEDIATE
                     'alter index '
                  || vindexrec.owner ||'.'
                  || vindexrec.index_name
                  || ' rebuild'
                  || ' parallel nologging compute statistics'
                  || ' tablespace '
                  || vindexrec.tablespace_name;
            EXCEPTION
               WHEN resource_busy OR TIMEOUT_ON_RESOURCE
               THEN
                  DBMS_OUTPUT.PUT_LINE (
                     'alter index - busy and wait for 1 sec');
                  DBMS_LOCK.sleep (c_trial_interval);

                  IF trial <= c_max_trial
                  THEN
                     GOTO alter_index;
                  ELSE
                     DBMS_OUTPUT.PUT_LINE (
                           'alter index busy and waited - quit after '
                        || TO_CHAR (c_max_trial)
                        || ' trials');
                     RAISE;
                  END IF;
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.PUT_LINE ('alter index err ' || SQLERRM);
                  RAISE;
            END;
         END IF;
      END IF;

      CLOSE csrindexstats;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE ('Global indices rebuilt: ' || TO_CHAR (vcount));
   vcount := 0;
   trial := 0;

   /* Local indexes */
   FOR vindexrec IN csrlocalindexes
   LOOP
      EXECUTE IMMEDIATE
            'analyze index '
         || vindexrec.index_owner||'.'
         || vindexrec.index_name
         || ' partition ('
         || vindexrec.partition_name
         || ') validate structure';

      OPEN csrindexstats;

      FETCH csrindexstats INTO vindexstats;

      IF csrindexstats%FOUND
      THEN
         IF    (vindexstats.height > pmaxheight)
            OR (    vindexstats.leafrows > 0
                AND vindexstats.leafrowsdeleted > 0
                AND (vindexstats.leafrowsdeleted * 100 / vindexstats.leafrows) >
                       pmaxleafsdeleted)
         THEN
            vcount := vcount + 1;
            DBMS_OUTPUT.PUT_LINE (
               'Rebuilding index ' || vindexrec.index_owner||'.'|| vindexrec.index_name || '...');

           <<alter_partitioned_index>>
            BEGIN
               EXECUTE IMMEDIATE
                     'alter index '
                  || vindexrec.index_owner||'.'
                  || vindexrec.index_name
                  || ' rebuild'
                  || ' partition '
                  || vindexrec.partition_name
                  || ' parallel nologging compute statistics'
                  || ' tablespace '
                  || vindexrec.tablespace_name;
            EXCEPTION
               WHEN resource_busy OR TIMEOUT_ON_RESOURCE
               THEN
                  DBMS_OUTPUT.PUT_LINE (
                     'alter partitioned index - busy and wait for 1 sec');
                  DBMS_LOCK.sleep (c_trial_interval);

                  IF trial <= c_max_trial
                  THEN
                     GOTO alter_partitioned_index;
                  ELSE
                     DBMS_OUTPUT.PUT_LINE (
                           'alter partitioned index busy and waited - quit after '
                        || TO_CHAR (c_max_trial)
                        || ' trials');
                     RAISE;
                  END IF;
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.PUT_LINE (
                     'alter partitioned index err ' || SQLERRM);
                  RAISE;
            END;
         END IF;
      END IF;

      CLOSE csrindexstats;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE ('Local indices rebuilt: ' || TO_CHAR (vcount));
END;
/
exit;


3、輸入日誌樣本
Current date and time is : Sun Apr 20 02:00:02 HKT 2014
Current DB is SYBO2 ===============================================
Rebuilding index GX_ADMIN.SYN_OUT_DATA_TBL_PK...
Rebuilding index GX_ADMIN.IDX_TDBK_SPLNK_PARENT_REF...
Rebuilding index GX_ADMIN.IDX_TDBK_SPLNK_CHILD_REF...
Rebuilding index GX_ADMIN.PK_TRADE_BROKER_TBL...
Rebuilding index GX_ADMIN.IDX_TDBK_INPUT_DATE...
    ................

4、後記
a、如果同一臺伺服器上有多個例項,且每個例項有相同的schema,此指令碼會輪巡所有例項並根據analyze結果來rebuild。 
a、大家應根據需要作相應調整,如指令碼的路徑資訊等。
b、需要修改相應的schema name。
d、可根據系統環境調整相應的並行度。


    Oracle&nbsp;牛鵬社

相關推薦

Oracle 重建索引指令碼

      索引是提高資料庫查詢效能的有力武器。沒有索引,就好比圖書館沒有圖書標籤一樣,找一本書自己想要的書比登天還難。然而索引在使用的過程中,尤其是在批量的DML的情形下會產生相應的碎片,以及B樹高度會發生相應變化,因此可以對這些變化較大的索引進行重構以提高效能。N久以前O

ORACLE重建索引

重建索引(重建索引方法很多,不同方法的適用條件不通,此處只列出一種) alter index 索引名稱 rebuild tablespace DELL_SPACE online; 索引分析 analyze index 索引名稱 validate struc

ORACLE重建索引詳解

一、重建索引的前提 1、表上頻繁發生update,delete操作; 2、表上發生了alter table ..move操作(move操作導致了rowid變化)。 二、重建索引的標準 1、索引重建是否有必要,一般看索引是否傾斜的嚴重,是否浪費了空間, 那應該如何

關於 Oracle 分割槽索引的失效和重建

–建立測試表 SQL> create table t as select object_id,object_name from dba_objects; 表已建立。 SQL> select min(object_id),max(object_id) from t;

oracle script: 重建索引

REM ============================================================= REM rebuild_index.sql REM 2013-11-14 REM Database Version : 7.3.X and

Scripts:重建索引指令碼(看懂指令碼再用)rebuild_indx.sql

REM ============================================================= REM REM                         rebuild_indx.sql REM REM  Copyright (c)

oracle重建索引

當我們建立索引時,oracle會為索引建立索引樹,表和索引樹通過rowid(偽列)來定位資料。當表裡的資料發生更新時,oracle會自動維護索引樹。但是在索引樹中沒有更新操作,只有刪除和插入操作。 例如在某表id列上建立索引,某表id列上有值“101”,當我將“101”更

oracle 優化--索引

數據庫應用 oracle create 程序 原則性 一、事務1、簡介事務是數據處理的核心,是業務上的一個邏輯單元,它能夠保證其中對數據所有的操作,要麽全部成功,要麽全部失敗。DBMS通過事務的管理來協調用戶的並發行為,減少用戶訪問資源的沖突。 1)顯示提交:當事務遇到COMMIT指令時,

刪除數組元素並重建索引的方法

索引 arr undefine logs bsp code err 數組 function 我們在用unset($arr($k))來刪除數組元素時,會發現被刪除的值的索引空了,因為業務的需要,我們有時候需要保留索引 有以下兩種方法: 方法一:array_values函數

oracle 重建scott的方法

oracle 重建scott的方法提醒:此方法只在oracle 10g 11g 12c上面實踐過1.首先找到這個路徑下SQL> ho pwd /home/oracle/product/11.2.0/rdbms/admin2.然後執行以下sql腳本SQL> @utlsampl.sql;執行完成之後,

Oracle索引名稱的唯一性

per 如果 ica complete art 自動 ctu ner 就是 數據庫索引處理是遇到的一點問題,簡單記錄下 oracle的規定,在同一個SCHEMA下的對象是不能用相同的名字命名的,一般創建索引名用“表名_字段名”,這樣能很快知道這個索引,是屬於哪個表的。

Oracle解決索引碎片功能

數據 時間 都是 val 情況 碎片 mage 分享圖片 解決 我們開始時向一個空的帶索引的表中插入大量數據後,是不會產生碎片問題的,但是,數據庫經過很長一段時間的增刪改查後,難免會出現碎片問題,影響數據庫的性能,Oracle對於這一問題有自己的解決方案。 下面介紹解決這一

DBCC DBREINDEX重建索引提高SQL Server性能

*** nta enter 有效 什麽 orm 顯示 unknown 完整 大多數SQL Server表需要索引來提高數據的訪問速度,如果沒有索引,SQL Server 要進行表格掃描讀取表中的每一個記錄才能找到索要的數據。索引可以分為簇索引和非簇索引,簇索引通過重排表中的

oracle全文索引的創建和使用

常用 iss 並且 手動 bms 文檔 計算 main family 整理一下我所遇到過的有關全文索引的問題吧 一、設置詞法分析器 Oracle實現全文檢索,其機制其實很簡單。即通過Oracle專利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱為

oracle 唯一索引,唯一約束,主鍵之間的聯系

檢查 特性 dad cda 聯系 其它 分享圖片 ges oracl 主鍵(primary key)是表中的一個或多個字段,它的值用於唯一地標識表中的某一條記錄,在兩個表的關系中,主鍵用來在一個表中引用來自於另一個表中的特定記錄,,主鍵時一種唯一關鍵字,表定義的一部分。一個

MongoDB索引管理——創建索引,查看索引,刪除索引重建索引

大小 exsi ngs 索引 mongodb reat 新建 mon 集合 先給users集合插入兩條記錄,然後用users集合來進行索引管理的演示: > user1={"name":"liming","age":20,"gender":"F"} { "name" :

oracle 禁用索引

ora 查詢 用戶名 AD ID n) server address ava 同步數據的時候 有索引會比較慢 可以暫時禁用索引 --禁用索引 ALTER INDEX PK_T_AUTH_USERROLE_ID UNUSABLE; --恢復索引ALTER INDEX UK_T

ORACLE 全域性索引和本地索引

Oracle資料庫中,有兩種型別的分割槽索引,全域性索引和本地索引,其中本地索引又可以分為本地字首索引和本地非字首索引。下面就分別看看每種型別的索引各自的特點。   全域性索引以整個表的資料為物件建立索引,索引分割槽中的索引條目既可能是基於相同的鍵值但是來自不同的分割槽,也可能是多

elasticsearch(10)重建索引

ES對於已存在的索引欄位無法修改,如果要修改索引結構,可以通過新建一個修改結構後的新索引,然後將舊索引中的資料複製到新索引中,變相實現修改索引。 配合索引別名可以實現無縫修改索引結構。 PUT /my_index_v1/_alias/my_index 示例:將testin

ElasticSearch最佳入門實踐(六十五)基於scoll+bulk+索引別名實現零停機重建索引

1、重建索引 一個field的設定是不能被修改的,如果要修改一個Field,那麼應該重新按照新的mapping,建立一個index,然後將資料批量查詢出來,重新用bulk api寫入index中 批量查詢的時候,建議採用scroll api,並且採用多執行緒