1. 程式人生 > >oracle中重建索引

oracle中重建索引

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

例如在某表id列上建立索引,某表id列上有值“101”,當我將“101”更新為“110”時,oracle同時會來更新索引樹,但是oracle先將索引樹中的“101”標示為刪除(實際並未刪除,只是標示一下),然後再將“110”寫到索引樹中。

如果表更新比較頻繁,那麼在索引中刪除標示會越來越多,這時索引的查詢效率必然降低,所以我們應該定期重建索引。來消除索引中這些刪除標記。

一般不會選擇先刪除索引,然後再重新建立索引,而是rebuild索引。在rebuild期間,使用者還可以使用原來的索引,並且rebuild新的索引時也會利用原來的索引資訊,這樣重建索引會塊一些。


G:\-N'Ac%[0這個實驗來察看索引中的刪除標記,並且如何重建索引。

試驗環境:oracle 8.1.7

一、建立表、插入記錄和建立索引
:Z4Sto'k n0SQL> create table ind (id number,name varchar2(100));

表已建立。

SQL> create or replace procedure sp_insert_ind
&Z#xK!^p&qq)J0  2  isITPUB個人空間[email protected]
  3  beginITPUB個人空間J/H-N*{2H5}7S(b;_
  4  for i in 1..10000 loopITPUB個人空間(M Cn-f f


  5  insert into ind values(i,to_char(i)||'aaaaaaaaaa');ITPUB個人空間j;nk+v#x-x[F{JUs
  6  end loop;ITPUB個人空間GuC/R9K"{!S:C-E
  7  end;
:Cu0[8e�v`.L0  8  /

過程已建立。

SQL> exec sp_insert_ind

PL/SQL 過程已成功完成。

ITPUB個人空間Kkg!m].A3jq
SQL> create index ind_id_idx on ind(id);

索引已建立。

二、收集索引資訊

--收集資訊,沒有更新資料字典,所以沒有資訊ITPUB個人空間 \vT"a#ZP#oex


SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;

未選定行


5})YlX5K6F Y7B\oc0--更新資料字典
_V [v9ZIS7BI0SQL> ANALYZE INDEX ind_id_idx VALIDATE STRUCTURE;

索引已分析


o[s?I+T0P?0--引數含義:ITPUB個人空間[7DT$T$zZMy"Ol
--LF_ROWS Number of values currently in the index
%\!_hW%N)lS:?8}0--LF_ROWS_LEN Sum in bytes of the length of all values
.bD`1Q'vNF0--DEL_LF_ROWS Number of values deleted from the index
DN2zoM`^l'U0--DEL_LF_ROWS_LEN Length of all deleted values

SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;

   LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN                             ITPUB個人空間*wkKJ$yv5b;M
---------- ----------- ----------- ---------------                             
uY7CFY:J5Lv\O0     10000      149801           0               0     

                       
!\A,A'{3QT7c4R7a0--察看索引中已經標示為刪除的行除以總共的行的數量,目前為0ITPUB個人空間8|4Bcy ^y
SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage  FROM index_stats;

INDEX_USAGE                                                                    ITPUB個人空間d:G6i'C4Z:I+c%h
-----------                                                                    
V%v)[K,C!u0          0      

三、更新索引,並且重新察看資訊
s?,a3Xx5M8D0                                                            ITPUB個人空間G4OY|5vuh
--更新表中1000行記錄,這時會更新索引樹
8N6V"G%}m4Nh*a+NT0SQL> update ind set id=id+1 where id>9000;

已更新1000行。

ITPUB個人空間/rk`j3kA]�|T
SQL> ANALYZE INDEX ind_id_idx VALIDATE STRUCTURE;

索引已分析


Y{@A\`E#O&p0--總共行的數量增加了1000行,並且標示為刪除了1000行記錄ITPUB個人空間!N;f#Fav{9Bk8}
SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;

   LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN                             ITPUB個人空間4|&u:z)Vt\i0n.NpW
---------- ----------- ----------- ---------------                             ITPUB個人空間)rXb6W|]E0A1|U
     11000      164792        1000           14990                             


/E#\|A+S|q ~0--察看索引中已經標示為刪除的行除以總共的行的數量,目前為 9.09631536,這個值如果查過20,肯定要重建索引了。
iSW%PX/S0SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage  FROM index_stats;

INDEX_USAGE                                                                    
[X uU/UL0-----------                                                                    
]Ek)V{!])?s09.09631536                                                                    

四、重建索引

--重建索引
VH~7~r,ON9W \0SQL> alter index ind_id_idx rebuild;

索引已更改。

SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;

未選定行

---以下資訊又基本回到從前
I]bN/Y9_v-L;rt"H0SQL> ANALYZE INDEX ind_id_idx VALIDATE STRUCTURE;

索引已分析

SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;

   LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN                             ITPUB個人空間%Y0q3^[email protected]&I.yW
---------- ----------- ----------- ---------------                             ITPUB個人空間m1E*v5K`:y9uT)`"w
     10000      149802           0               0                             

SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage  FROM index_stats;

INDEX_USAGE                                                                    
y|6T],O X y&Z0-----------                                                                    ITPUB個人空間2l|@hAt3FH
          0        


相關推薦

oracle重建索引

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

簡單瞭解,使用oracle索引,表分割槽

索引的分類 如下: 物理分類 邏輯分類 分割槽或非分割槽索引 單列或組合索引 B樹索引(標準索引) 唯一或非唯一索引 正常或反向鍵索引 基於函式索引 點陣

oracle script: 重建索引

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

Oracle查詢索引名稱,批量修改索引名稱語句

   在Oralce資料庫資料優化過程中,對源資料表處理,原則上是做更名備份,作為被查或回退使用,所以,有修改資料表名後重新建表的操作,這樣,往往也需要修改索引、主鍵、外來鍵名稱,方便重建,為了方便、快速生成處理資料指令碼,採用批量處理方式,如第4、5段例句,拼接字串,生成批量處理指令碼。 一、依據DBA檢視

oracle索引----重要

通俗的來講,索引在表中的作用,相當於書的目錄對書的作用。                         —-前言 一、索引的優點 索引是與表相關的一個可選結構               一個表中可以存在索引,也可以不存在索引,不做

怎麽解決ORACLE CHAR類型的索引問題

添加 關聯查詢 系統 pre 破壞 補全 如果 關聯 acl 在很多場景中,都有如下情況 trim(a.colunm1) = trim(b.colunm2) 應該怎麽優化呢? 用到 TRIM 的很多原因是某些系統為了提高查詢效率,不使用 ORACLE 的特有的,優秀的

Oracle索引名稱的唯一性

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

oracle分割槽表本地索引和全域性索引的適用場景

【背景】分割槽表建立好了之後,如果需要最大化分割槽表的效能就需要結合索引的使用,分割槽表有兩種索引:本地索引和全域性索引。既然存在著兩種的索引型別,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的效能的; 本文件通過測試,總結出兩種索引的適合

oracle為shape欄位新增索引

表名為oscline,shape欄位的格式為sdo_geometry INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)  VALUES ('OSCLINE', 'shape', &nb

Oracle,如何確定熱快是資料塊還是索引塊?

每一個數據塊在被讀入buffer cache時,都會先在buffer cache中構造一個buffer header,buffer header與資料塊一一對應每個buffer header在x$bh中都存在一條記錄buffer header中儲存1) 該資料塊在buffer cache中實際的記憶體地址。

ORACLE重建索引

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

Oracle 重建索引指令碼

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

oracle新建表 新增備註 新增主鍵 建立索引

例如新建表twf_processversion 1.新建表 create table TWF_PROCESSVERSION (   FLDPROCESSID   VARCHAR2(64),   FLDID          VARCHAR2(32) not null,  

Oracle索引及空間索引的總結整理

索引:對資料庫表中的某些列進行排序,便於提高查詢效率。索引與表一樣,也屬於段(segment)的一種。裡面存放了使用者的資料,跟表一樣需要佔用磁碟空間。索引是一種允許直接訪問資料表中某一資料行的樹型結構,為了提高查詢效率而引入,是一個獨立於表的物件,可以存放在與表不同的表空間

ORACLE重建索引詳解

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

Oracle主鍵和唯一索引的區別oracle聯合主鍵的作用

 在建立主鍵的同時會生成對應的唯一索引,主鍵在保證資料唯一性的同時不允許為空, 而唯一索引可以有一個為空的資料項,一個表中只能有一個主鍵,但是一個主鍵可以有多個欄位,一個表中可以有多個唯一索引。 聯合主鍵只是讓記錄聯合的那幾個欄位總體上是唯一的,比如id1 id2 id3三

oracle監控表索引是否使用

在oracle中,合理規劃索引,避免為後續的維護和優化帶來麻煩。因此有時候需要監控已有的索引是否在使用,oracle提供了監控索引是否使用的工具:monitoring 首先,我們如果是監控一個表上的所有索引,可以這樣先生成監控的命令: SQL> select 'al

ORACLE關於外來鍵缺少索引的探討和總結

作者:瀟湘隱者 在ORACLE資料庫中,定義外來鍵約束時,ORACLE是不會自動建立對應索引的,必須手動在外來鍵約束相關的列上建立索引。那麼外來鍵欄位上是否有必要建立索引呢?如果有必要的話,巡檢時,如何找出外來鍵欄位上沒有建立索引的相關表,並生成對應的索引的指

Oracle 的sql函數以及分頁

轉換 通用 pro page 大寫 example 分享 bstr case SELECT LPAD(‘Page 1‘,15,‘*.‘) "LPAD example" FROM DUAL; 1.分頁查詢 (1)方法一:使用 between and

Oracle 的操作符

des 觸發 union miner 交集 作用 我們 重復 過程 1.union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序; SELECT * FROM emp WHERE sal < 1500 UNION SELECT * FROM