創(chuàng)建索引語法:
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、習(xí)水網(wǎng)站維護(hù)、網(wǎng)站推廣。
CREATE [UNIQUE] | [BITMAP] INDEX index_name
--unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2
--bitmap,創(chuàng)建位圖索引
[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]
--指定索引在數(shù)據(jù)塊中空閑空間
[STORAGE (INITIAL n2)][NOLOGGING]
--表示創(chuàng)建和重建索引時(shí)允許對(duì)表做DML操作,默認(rèn)情況下不應(yīng)該使用
[NOLINE][NOSORT];
--表示創(chuàng)建索引時(shí)不進(jìn)行排序,默認(rèn)不適用,如果數(shù)據(jù)已經(jīng)是按照該索引順序排列的可以使用
擴(kuò)展資料:
1、如果有兩個(gè)或者以上的索引,其中有一個(gè)唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2、至少要包含組合索引的第一列(即如果索引建立在多個(gè)列上,只有它的第一個(gè)列被where子句引用時(shí),優(yōu)化器才會(huì)使用該索引)
3、小表不要簡歷索引
4、對(duì)于基數(shù)大的列適合建立B樹索引,對(duì)于基數(shù)小的列適合簡歷位圖索引
5、列中有很多空值,但經(jīng)常查詢?cè)摿猩戏强沼涗洉r(shí)應(yīng)該建立索引
6、經(jīng)常進(jìn)行連接查詢的列應(yīng)該創(chuàng)建索引
7、使用create index時(shí)要將最常查詢的列放在最前面
8、LONG(可變長字符串?dāng)?shù)據(jù),最長2G)和LONG RAW(可變長二進(jìn)制數(shù)據(jù),最長2G)列不能創(chuàng)建索引
9、限制表中索引的數(shù)量(創(chuàng)建索引耗費(fèi)時(shí)間,并且隨數(shù)據(jù)量的增大而增大;索引會(huì)占用物理空間;當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度)
------索引名不能重復(fù),如果要重新建同名索引,必須把以前的索引刪掉在建索引
-----刪除索引
drop index 索引名;
-----創(chuàng)建索引
create index 索引名 on 表名 (表中的字段,表中的字段)
tablespace 指定的表空間
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
用rebuile語句即可啊
Alter?indexindex_name?rebuild;
Alter?indexindex_name?rebuild?online;
也可以把索引刪除了重新建立
drop?index?indexindex_name;
create?index?indexindex_name?on?table_name(col_name);
對(duì)三個(gè)字段建立索引:\x0d\x0acreate index Stuname on student(name);\x0d\x0acreate index Stusex on student(sex);\x0d\x0acreate index Stugrade on student(grade);\x0d\x0a注意的問題,考慮是不是要建立唯一索引(unique),如果有學(xué)號(hào)的話,可以考慮建立唯一索引引。\x0d\x0a再就是對(duì)經(jīng)常查詢,但又相對(duì)穩(wěn)定的可以建立聚簇索引,提高查詢效率
· 通過全表掃描的方式訪問數(shù)據(jù);
· 通過ROWID訪問數(shù)據(jù);
· 通過索引的方式訪問數(shù)據(jù);
· Oracle順序讀取表中所有的行,并逐條匹配WHERE限定條件。
· 采用多塊讀的方式進(jìn)行全表掃描,可以有效提高系統(tǒng)的吞吐量,降低I/O次數(shù)。
· 即使創(chuàng)建索引,Oracle也會(huì)根據(jù)CBO的計(jì)算結(jié)果,決定是否使用索引。
注意事項(xiàng):
· 只有全表掃描時(shí)才可以使用多塊讀。該方式下,單個(gè)數(shù)據(jù)塊僅訪問一次。
· 對(duì)于數(shù)據(jù)量較大的表,不建議使用全表掃描進(jìn)行訪問。
· 當(dāng)訪問表中的數(shù)據(jù)量超過數(shù)據(jù)總量的5%—10%時(shí),通常Oracle會(huì)采用全表掃描的方式進(jìn)行訪問。
· 并行查詢可能會(huì)導(dǎo)致優(yōu)化器選擇全表掃描的方式。1.2ROWID訪問表
· Rowid是數(shù)據(jù)存放在數(shù)據(jù)庫中的物理地址,能夠唯一標(biāo)識(shí)表中的一條數(shù)據(jù)。
· Rowid指出了一條記錄所在的數(shù)據(jù)文件、塊號(hào)以及行號(hào)的位置,因此通過ROWID定位單行數(shù)據(jù)是最快的方法。
注意事項(xiàng):
· Rowid作為一個(gè)偽列,其數(shù)值并不存儲(chǔ)在數(shù)據(jù)庫中,當(dāng)查詢時(shí)才進(jìn)行計(jì)算。
· Rowid除了在同一集簇中可能不唯一外,每條記錄的Rowid唯一。1.3 INDEX訪問表
· 通過索引查找相應(yīng)數(shù)據(jù)行的Rowid,再根據(jù)Rowid查找表中實(shí)際數(shù)據(jù)的方式稱為“索引查找”或者“索引掃描”。
· 一個(gè)Rowid對(duì)應(yīng)一條數(shù)據(jù)行(根據(jù)Rowid查找結(jié)果,僅需要對(duì)Rowid相應(yīng)數(shù)據(jù)的數(shù)據(jù)塊進(jìn)行一次I/O操作),因此該方式屬于“單塊讀”。
· 對(duì)于索引,除了存儲(chǔ)索引的數(shù)據(jù)外,還保存有該數(shù)據(jù)對(duì)應(yīng)的Rowid信息。
· 索引掃描分為兩步:1)掃描索引確定相應(yīng)的Rowid信息。 2)根據(jù)Rowid從表中獲得對(duì)應(yīng)的數(shù)據(jù)。
注意事項(xiàng):
· 對(duì)于選擇性高的數(shù)據(jù)行,索引的使用會(huì)提升查詢的性能。但對(duì)于DML操作,尤其是批量數(shù)據(jù)的操作,可能會(huì)導(dǎo)致性能的降低。
· 全表掃描的效率不一定比索引掃描差,關(guān)鍵看數(shù)據(jù)在數(shù)據(jù)塊上的具體分布。
索引是關(guān)系數(shù)據(jù)庫中用于存放每一條記錄的一種對(duì)象,主要目的是加快數(shù)據(jù)的讀取速度和完整性檢查。建立索引是一項(xiàng)技術(shù)性要求高的工作。一般在數(shù)據(jù)庫設(shè)計(jì)階段的與數(shù)據(jù)庫結(jié)構(gòu)一道考慮。應(yīng)用系統(tǒng)的性能直接與索引的合理直接有關(guān)。
(1) 單列索引
單列索引是基于單個(gè)列所建立的索引。
(2) 復(fù)合索引
復(fù)合索引是基于兩列或是多列的索引,在同一張表上可以有多個(gè)索引,但是要求列的組合必須不同。
(1) 重命名索引
(2) 合并索引
(表使用一段時(shí)間后在索引中會(huì)產(chǎn)生碎片,此時(shí)索引效率會(huì)降低,可以選擇重建索引或者合并索引,合并索引方式更好些,無需額外存儲(chǔ)空間,代價(jià)較低)
(3) 重建索引
方式一:刪除原來的索引,重新建立索引
當(dāng)不需要時(shí)可以將索引刪除以釋放出硬盤空間。命令如下:
例如:
注:當(dāng)表結(jié)構(gòu)被刪除時(shí),有其相關(guān)的所有索引也隨之被刪除。
方式二: Alter index 索引名稱 rebuild;
· 通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
· 索引可以大大加快數(shù)據(jù)的檢索速度,這是創(chuàng)建索引的最主要的原因。
· 可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
· 在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。
· 通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
· 索引的層次不要超過4層。
· 創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。
· 除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。
· 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
· 更新數(shù)據(jù)的時(shí)候,系統(tǒng)必須要有額外的時(shí)間來同時(shí)對(duì)索引進(jìn)行更新,以維持?jǐn)?shù)據(jù)和索引的一致性。
1) 不恰當(dāng)?shù)乃饕坏谑聼o補(bǔ),反而會(huì)降低系統(tǒng)性能。因?yàn)榇罅康乃饕谶M(jìn)行插入、修改和刪除操作時(shí)比沒有索引花費(fèi)更多的系統(tǒng)時(shí)間。
1) 應(yīng)該建索引的列
· 在經(jīng)常需要搜索的列上,可以加快搜索的速度;
· 在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);
· 在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
· 在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;
· 在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時(shí)間;
· 在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
2) 不應(yīng)該建索引的列
· 在大表上建立索引才有意義,小表無意義。
· 對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。
· 對(duì)于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。比如性別,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,。增加索引,并不能明顯加快檢索速度。
· 對(duì)于那些定義為blob數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因?yàn)?,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。
· 當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。
一個(gè)表中有幾百萬條數(shù)據(jù),對(duì)某個(gè)字段加了索引,但是查詢時(shí)性能并沒有什么提高,這主要可能是oracle的索引限制造成的。Oracle的索引有一些索引限制,在這些索引限制發(fā)生的情況下,即使已經(jīng)加了索引,oracle還是會(huì)執(zhí)行一次全表掃描,查詢的性能不會(huì)比不加索引有所提高,反而可能由于數(shù)據(jù)庫維護(hù)索引的系統(tǒng)開銷造成性能更差。
下面的查詢即使在djlx列有索引,查詢語句仍然執(zhí)行一次全表掃描。
把上面的語句改成如下的查詢語句,這樣,在采用基于規(guī)則的優(yōu)化器而不是基于代價(jià)的優(yōu)化器(更智能)時(shí),將會(huì)使用索引。
特別注意:通過把不等于操作符改成OR條件,就可以使用索引,避免全表掃描。
使用IS NULL或IS NOT NULL同樣會(huì)限制索引的使用。因此在建表時(shí),把需要索引的列設(shè)成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會(huì)使用這個(gè)索引(除非索引是一個(gè)位圖索引)。
如果不使用基于函數(shù)的索引,那么在SQL語句的WHERE子句中對(duì)存在索引的列使用函數(shù)時(shí),會(huì)使優(yōu)化器忽略掉這些索引。 下面的查詢不會(huì)使用索引(只要它不是基于函數(shù)的索引)
也是比較難于發(fā)現(xiàn)的性能問題之一。比如:bdcs_qlr_xz中的zjh是NVARCHAR2類型,在zjh字段上有索引。如果使用下面的語句將執(zhí)行全表掃描。
因?yàn)镺racle會(huì)自動(dòng)把查詢語句改為
特別注意:不匹配的數(shù)據(jù)類型之間比較會(huì)讓Oracle自動(dòng)限制索引的使用,即便對(duì)這個(gè)查詢執(zhí)行Explain Plan也不能讓您明白為什么做了一次“全表掃描”。
(1) 索引無效
(2) 索引有效
Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4
oracle 索引什么時(shí)候重建和重建方法討論
分類:數(shù)據(jù)庫技術(shù) 字號(hào): 大大中中小小 索引什么時(shí)候需要重建和重建的方法
一提到索引,大家都知道,但是怎樣建索引,什么時(shí)候重建索引,重建索引用什么方法,可能有的就不太清楚了,我根據(jù)一些資料簡單的整理一點(diǎn),如果哪里不對(duì)或是不妥請(qǐng)大家指點(diǎn),希望大家有更好經(jīng)驗(yàn)也share出來。
索引的目的是為了加快尋找數(shù)據(jù)的速度,但是如果對(duì)表經(jīng)常做改動(dòng),則索引也會(huì)相應(yīng)改動(dòng),時(shí)間長了,查詢速度的效率就會(huì)降低,就有可能要重建索引,那么什么時(shí)候需要重建索引和用什么方法重建索引可能是大家關(guān)心的。
一. 索引在內(nèi)部進(jìn)行自身的管理以確保對(duì)數(shù)據(jù)行的快速訪問。但是數(shù)據(jù)表中大量的活動(dòng)會(huì)導(dǎo)致oracle索引動(dòng)態(tài)地對(duì)自身的進(jìn)行重新配置,這些配置包括三個(gè)方面:
1.索引分割
當(dāng)新數(shù)據(jù)行產(chǎn)生的索引節(jié)點(diǎn)要建立在現(xiàn)有級(jí)別上時(shí),出現(xiàn)此動(dòng)作。
2.索引生成
在某些位置,索引達(dá)到此級(jí)索引的最大容量的時(shí)候,就會(huì)生成更深一級(jí)的索引結(jié)構(gòu)。
3.索引節(jié)點(diǎn)的刪除
你可能了解到,刪除表中的數(shù)據(jù)行后,索引中相應(yīng)的節(jié)點(diǎn)不會(huì)從物理意義上刪除,也沒有從索引中刪除此項(xiàng)目。而是從邏輯上刪除此索引項(xiàng)目,并在索引樹中留下了一個(gè)“死“節(jié)點(diǎn),當(dāng)索引刪除了葉節(jié)點(diǎn)或是生成了過深的的級(jí)別層次后,就需要進(jìn)行重建。
二 索引的種類:
a.B-tree(B樹)索引
b.壓縮B樹索引
c.Bitmap(位圖)索引
d.函數(shù)索引
e.Reverse Key Index(反向鍵索引)
f.Index Organized Table(索引組織表)
三 下面分別對(duì)各種索引進(jìn)行說明
在進(jìn)行介紹前先說明幾個(gè)術(shù)語:
高基數(shù):簡單理解就是表中列的不同值多
低基數(shù):建單理解就是表中的列的不同值少
以刪除的葉節(jié)點(diǎn)數(shù)量:指得是數(shù)據(jù)行的delete操作從邏輯上刪除的索引節(jié)點(diǎn)的數(shù)量,要記住oracle在刪除數(shù)據(jù)行后,將“死“節(jié)點(diǎn)保留在索引中,這樣做可以加快sql刪除操作的速度,因此oracle刪除數(shù)據(jù)行后可以不必重新平衡索引。
索引高度:索引高度是指由于數(shù)據(jù)行的插入操作而產(chǎn)生的索引層數(shù),當(dāng)表中添加大量數(shù)據(jù)時(shí),oracle將生成索引的新層次以適應(yīng)加入的數(shù)據(jù)行,因此, oracle索引可能有4層,但是這只會(huì)出現(xiàn)在索引數(shù)中產(chǎn)生大量插入操作的區(qū)域。Oracle索引的三層結(jié)構(gòu)可以支持?jǐn)?shù)百萬的項(xiàng)目,而具備4層或是更多層的需要重建。
每次索引訪問的讀取數(shù):是指利用索引讀取一數(shù)據(jù)行時(shí)所需要的邏輯I/O操作數(shù),邏輯讀取不必是物理讀取,因?yàn)樗饕脑S多內(nèi)容已經(jīng)保存在數(shù)據(jù)緩沖區(qū),然而,任何數(shù)據(jù)大于10的索引都需要重建。
1. B-tree(B樹)索引
是現(xiàn)代關(guān)系型數(shù)據(jù)庫中最常用的索引。除了存儲(chǔ)索引數(shù)據(jù)外,還存儲(chǔ)一個(gè)行ID,用來指出該行其余數(shù)據(jù)存儲(chǔ)在這個(gè)被索引表中的什么地方。該索引以一種數(shù)結(jié)構(gòu)格式存儲(chǔ)這些值。
Oracle建議如果表經(jīng)過排序,當(dāng)返回40%一下的數(shù)據(jù)時(shí)使用索引,如果高于40%則使用全表掃描,如果沒有經(jīng)過排序,則當(dāng)返回7%以下時(shí),使用索引??幢硎欠衽判颍梢钥磀ba_indexes字典中的CLUSTERING_FACTOR列,如果與表占用的數(shù)據(jù)塊數(shù)相近,則經(jīng)過了排序,如果與行數(shù)相近,則沒有排序。那么什么時(shí)候重建呢?我們可以利用analyze index …….. compute statistics 對(duì)表進(jìn)行分析。然后察看dba_indexes中的blevel。這列是說明索引從根塊到葉快的級(jí)別,或是深度。如果級(jí)別大于等于4。則需要重建,如下:
Select index_name,blevel from dba_indexeswhere blevel=4.
另一個(gè)從重建中受益的指標(biāo)顯然是當(dāng)該索引中的被刪除項(xiàng)占總的項(xiàng)數(shù)的百分比。如果在20%以上時(shí),也應(yīng)當(dāng)重建,如下
SQLanlyze index ------ validatestructure
SQLselect(del_lf_rows_len/lf_rows_len)*100 from index_stats where 刪除并從頭開始建立索引。
b. 使用alter index -------- rebuild 命令重建索引
c. 使用alter index -------- coalesce命令重建索引。
下面討論一下這三種方法的優(yōu)缺點(diǎn):
1).刪除并從頭開始建索引:方法是最慢的,最耗時(shí)的。一般不建議。
2).Alter index ---- rebuild 快速重建索引的一種有效的辦法,因?yàn)槭褂矛F(xiàn)有索引項(xiàng)來重建新索引,如果客戶操作時(shí)有其他用戶在對(duì)這個(gè)表操作,盡量使用帶online參數(shù)來最大限度的減少索引重建時(shí)將會(huì)出現(xiàn)的任何加鎖問題,alter index ------- rebuild online.但是,由于新舊索引在建立時(shí)同時(shí)存在,因此,使用這種技巧則需要有額外的磁盤空間可臨時(shí)使用,當(dāng)索引建完后把老索引刪除,如果沒有成功,也不會(huì)影響原來的索引。利用這種辦法可以用來將一個(gè)索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個(gè)命令的執(zhí)行步驟如下:
首先,逐一讀取現(xiàn)有索引,以獲取索引的關(guān)鍵字。
其次,按新的結(jié)構(gòu)填寫臨時(shí)數(shù)據(jù)段。
最后,一旦操作成功,刪除原有索引樹,降臨時(shí)數(shù)據(jù)段重命名為新的索引。
需要注意的是alterindex ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現(xiàn)有索引相同的表空間進(jìn)行。
3).alter index ----- coalesce 使用帶有coalesce參數(shù)時(shí)重建期間不需要額外空間,它只是在重建索引時(shí)將處于同一個(gè)索引分支內(nèi)的葉塊拼合起來,這最大限度的減少了與查詢過程中相關(guān)的潛在的加鎖問題,但是,coalesce選項(xiàng)不能用來講一個(gè)索引轉(zhuǎn)移到其他表空間。
2.壓縮B樹索引
當(dāng)B樹索引基于大表時(shí),尤其是當(dāng)基于數(shù)據(jù)倉庫或決策支持系統(tǒng)中的大表時(shí),這些索引會(huì)耗費(fèi)大量的存儲(chǔ)空間,壓縮(compressed)B樹索引用來最大限度的減少某些類型的B樹索引使用的空間。當(dāng)一個(gè)B樹索引得到壓縮時(shí),被索引的獵的重復(fù)出現(xiàn)就被消除掉,進(jìn)而減少了存儲(chǔ)索引的總的存儲(chǔ)空間。例如:
壓縮前:smith每次出現(xiàn)還要存儲(chǔ)它的相關(guān)的rowid.
姓 關(guān)聯(lián)rowid
smith AAABSOAAEAAAABTAAB
smith AAABSOAAEAAAABTAAC
smith AAABSOAAEAAAABTAAD
壓縮后:smith項(xiàng)和rowid指存儲(chǔ)一次。
smith AAABSOAAEAAAABTAAB,AAABSOAAEAAAABTAAB, AAABSOAAEAAAABTAAB
創(chuàng)建方法:
SQLcreate index index_name ontable_name(column_name)
tablespace tablespace_name
compress;
另一種方法:
SQLalter index index_name rebuildcompress;
3. itmap(位圖)索引。
B樹索引在數(shù)據(jù)具有高基數(shù)的列工作的最好,對(duì)于低基數(shù)的列,位圖索引可能是更有效的選擇。位圖索引創(chuàng)建表行的一個(gè)二進(jìn)制映像,并把映像存儲(chǔ)在索引塊中,這種類型的索引的DML操作少,長度大并且含有極少不同的值得列特別有用。位圖索引不應(yīng)當(dāng)用在頻繁發(fā)生insert,update,delete操作的表上,這些dml操作在性能方面的代價(jià)很高,因?yàn)椋麄儠?huì)引起位圖級(jí)的加鎖發(fā)生,而且要求動(dòng)態(tài)的重建所有可能值的位圖。為圖索引最適合數(shù)據(jù)倉庫和決策支持系統(tǒng)。
4.基于函數(shù)的索引
當(dāng)把一個(gè)函數(shù)運(yùn)用于被索引的列上時(shí),該列德索引都變得無效,基于函數(shù)的索引就是為了解決這個(gè)問題。
5.反向鍵索引
是一種特殊類型的B樹索引,在索引基于含有序數(shù)的列時(shí)使非常有用的,如果一個(gè)傳統(tǒng)的B樹索引基于一個(gè)含有這種數(shù)據(jù)的列,往往會(huì)產(chǎn)生許多級(jí),由于B樹索引有 4級(jí)以上的深度會(huì)降低性能,因此反向鍵索引更適合這種類型,反向鍵索引通過簡單的煩象被索引的列中的數(shù)據(jù)來解決問題,他首先反向每個(gè)列鍵值的字節(jié),然后在反向后的新數(shù)據(jù)上進(jìn)行索引,而新數(shù)據(jù)在值的范圍上的分布通常比原來的有序數(shù)更均勻。
6.索引組織表
由于B樹、位圖、反向鍵索引的使用而引起的性能將會(huì)導(dǎo)致這樣的事實(shí),這些索引中的項(xiàng)目直接指向索引基表中對(duì)應(yīng)數(shù)據(jù)的行ID,這是從表行沒有按任何特定的順序來物理地存儲(chǔ)表中檢索表行的一種有效方法,這種表叫做堆表,oracle大多數(shù)表中以一種堆疊方式存儲(chǔ)行數(shù)據(jù),因?yàn)樾幸砸环N或多或少的隨機(jī)方式被分配給表內(nèi)的塊,之所以出現(xiàn)這種隨機(jī)性,是因?yàn)閛racle在決定把一個(gè)行存儲(chǔ)在何處時(shí)并不考慮改行的內(nèi)容,oracle只是把該行存儲(chǔ)在它從該表的freelist 上所發(fā)現(xiàn)的第一個(gè)塊中。
如果希望按一種指定順序來存儲(chǔ)一個(gè)表的數(shù)據(jù),就不能使用堆表,為此oracle提供了索引組織表,索引組織表不是存儲(chǔ)一個(gè)指向行數(shù)據(jù)的其余部分存儲(chǔ)在了何處的行的ID指針,而是把行數(shù)據(jù)全部存儲(chǔ)在索引本身內(nèi),這產(chǎn)生了兩個(gè)性能好處:
n 表行按索引順序來存儲(chǔ)。
n 使用B樹索引時(shí)引起的先讀取索引后讀取表鎖使用的額外I/O操作得到消除。
例如:
sqlcreate table emp
(last_name varchar2(9) primary key,
first_name varchar2(9),
hire_date date)
organization index tablespace users
pctthreshold 25
including first name
overflow tablespace qyl
mapping table;
所有索引組織表在將要作為索引基礎(chǔ)的那一列上都必須有一個(gè)主鍵約束,索引組織表不能含有唯一性約束或是被聚簇。
下面說明各個(gè)參數(shù)的含義:
organization index:說明該表是索引組織表
pctthreshold :指定整個(gè)數(shù)據(jù)塊的什么百分比要保持打開,以便存儲(chǔ)一個(gè)與主鍵值相關(guān)聯(lián)的行數(shù)據(jù),其中主鍵值必須在0到50之間(50是默認(rèn)值)
including : 指定在行長度超過pctthershold中所設(shè)置的大小時(shí)按那一列 把行分解成兩段
overflow tablespace :指定在行長度超過pctthreshold中設(shè)置的大小時(shí)行數(shù)的的另一部分存儲(chǔ)到的表空間。
Mapping table:致使在創(chuàng)建索引組織表的位圖索引時(shí)所必需的一個(gè)關(guān)聯(lián)映像表的創(chuàng)建。
以上是我根據(jù)一些資料對(duì)索引的一個(gè)簡單闡述,大家可能有不同的見解,希望對(duì)大家有幫助,那些不妥的地方還希望大家提出來。
參考資料:ocp困惑racle9i性能調(diào)整
oracle statspack 高性能調(diào)整技術(shù)
[@more@]
analyze index t_id_ind validate structure
select (del_lf_rows_len/lf_rows_len)*100 from index_stats
20%
b. 使用alter index t_id_ind rebuild 命令重建索引
c. 使用alter index t_id_ind coalesce命令重建索引。
alter indext_id_ind rebuild online.
但是,由于新舊索引在建立時(shí)同時(shí)存在,因此,使用這種技巧則需要有額外的磁盤空間可臨時(shí)使用,當(dāng)索引建完后把老索引刪除,如果沒有成功,也不會(huì)影響原來的索引。利用這種辦法可以用來將一個(gè)索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個(gè)命令的執(zhí)行步驟如下:
首先,逐一讀取現(xiàn)有索引,以獲取索引的關(guān)鍵字。
其次,按新的結(jié)構(gòu)填寫臨時(shí)數(shù)據(jù)段。
最后,一旦操作成功,刪除原有索引樹,降臨時(shí)數(shù)據(jù)段重命名為新的索引。
需要注意的是alter index ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現(xiàn)有索引相同的表空間進(jìn)行
alter index ----- coalesce 使用帶有coalesce參數(shù)時(shí)重建期間不需要額外空間,它只是在重建索引時(shí)將處于同一個(gè)索引分支內(nèi)的葉塊拼合起來,這最大限度的減少了與查詢過程中相關(guān)的潛在的加鎖問題,但是,coalesce選項(xiàng)不能用來講一個(gè)索引轉(zhuǎn)移到其他表空間