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