Oracle關(guān)于重建索引爭論的總結(jié)
索引重建是一個(gè)爭論不休被不斷熱烈討論的議題。當(dāng)然Oracle官方也有自己的觀點(diǎn),我們很多DBA也是遵循這一準(zhǔn)則來重建索引,那就是Oracle建議對(duì)于索引深度超過4級(jí)以及已刪除的索引條目至少占有現(xiàn)有索引條目總數(shù)的20% 這2種情形下需要重建索引。近來Oracle也提出了一些與之相反的觀點(diǎn),就是強(qiáng)烈建議不要定期重建索引。本文是參考了1525787.1并進(jìn)行相應(yīng)描述。
1、重建索引的理由
a、Oracle的B樹索引隨著時(shí)間的推移變得不平衡(誤解)
b、索引碎片在不斷增加
c、索引不斷增加,刪除的空間沒有重復(fù)使用
d、索引 clustering factor (集群因子)不同步,可以通過重建修復(fù)(誤解)
2、重建索引的本質(zhì)
本質(zhì):重建索引在數(shù)據(jù)庫內(nèi)部是先執(zhí)行刪除操作,再執(zhí)行插入操作。
3、反對(duì)重建索引的理由
a. 大多數(shù)腳本都依賴 index_stats 動(dòng)態(tài)表。此表使用以下命令填充:
analyze index ... validate structure;
盡管這是一種有效的索引檢查方法,但是它在分析索引時(shí)會(huì)獲取獨(dú)占表鎖。對(duì)于大型索引,其影響會(huì)是巨大的,因?yàn)樵诖似陂g不允許對(duì)表執(zhí)行DML 操作。
雖然該方法可以在不鎖表的情況下在線運(yùn)行,但是可能要消耗額外的時(shí)間。
b. 重建索引的直接結(jié)果是 REDO 活動(dòng)可能會(huì)增加,總體系統(tǒng)負(fù)載也可能會(huì)提高。
插入/更新/刪除操作會(huì)導(dǎo)致索引隨著索引的分割和增長不斷發(fā)展。
重建索引后,它將連接的更為緊湊;但是,隨著對(duì)表不斷執(zhí)行 DML 操作,必須再次分割索引,直到索引達(dá)到平衡為止。
結(jié)果,重做活動(dòng)增加,且索引分割更有可能對(duì)性能產(chǎn)生直接影響,因?yàn)槲覀冃枰獙⒏嗟?I/O、CPU 等用于索引重建。
經(jīng)過一段時(shí)間后,索引可能會(huì)再次遇到“問題”,因此可能會(huì)再被標(biāo)記為重建,從而陷入惡性循環(huán)。
因此,通常最好是讓索引處于自然平衡和(或)至少要防止定期重建索引。
4、Oracle的最終建議
一般而言,極少需要重建 B 樹索引,基本原因是 B 樹索引很大程度上可以自我管理或自我平衡。
大多數(shù)索引都能保持平衡和完整,因?yàn)榭臻e的葉條目可以重復(fù)使用。
插入/更新和刪除操作確實(shí)會(huì)導(dǎo)致索引塊周圍的可用空間形成碎片,但是一般來說這些碎片都會(huì)被正確的重用。
Clustering factor群集因子反映了給定的索引鍵值所對(duì)應(yīng)的表中的數(shù)據(jù)排序情況。重建索引不會(huì)對(duì)群集因子產(chǎn)生影響,集群因子只能通過重組表的數(shù)據(jù)改變。
強(qiáng)烈建議不要定期重建索引,而應(yīng)使用合適的診斷工具。
個(gè)人結(jié)論,如果重建索引的巨大工作量與之對(duì)應(yīng)的是極小的收益,那就得不償失。如果系統(tǒng)有可用空閑期,重建之前和之后的測量結(jié)果表明性能有提高,值得重建。
5、改良方法
通常是優(yōu)先考慮index coalesce(索引合并),而不是重建索引。索引合并有如下優(yōu)點(diǎn):
a、不需要占用近磁盤存儲(chǔ)空間 2 倍的空間
b、可以在線操作
c、無需重建索引結(jié)構(gòu),而是盡快地合并索引葉塊,這樣可避免系統(tǒng)開銷過大。
6、真正需要重建索引的情形
索引或索引分區(qū)因介質(zhì)故障損壞
標(biāo)記為UNUSABEL的索引需要重建
索引移動(dòng)到新的表空間或需要改變某些存儲(chǔ)參數(shù)
通過SQL*Loader加載數(shù)據(jù)到表分區(qū)后,需要重建索引分區(qū)
重建索引以啟用鍵壓縮
位圖索引本質(zhì)不同于B樹索引,建議重建
相關(guān)文章
oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令使用方法
這篇文章主要介紹了oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令格式,對(duì)單表導(dǎo)出、多張表導(dǎo)出的方法2013-11-11連接Oracle數(shù)據(jù)庫失敗(ORA-12514)故障排除全過程
Oracle連接失敗是指在使用Oracle數(shù)據(jù)庫進(jìn)行開發(fā)的過程中,服務(wù)器端無法與客戶端連接,從而導(dǎo)致Oracle連接無法成功,影響開發(fā)的效率,下面這篇文章主要給大家介紹了關(guān)于連接Oracle數(shù)據(jù)庫失敗(ORA-12514)故障排除的相關(guān)資料,需要的朋友可以參考下2023-05-05oracle實(shí)現(xiàn)按天,周,月,季度,年查詢排序方法
這篇文章主要介紹了oracle按天,周,月,季度,年查詢排序功能,本文給出了sql語句,每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Oracle數(shù)據(jù)庫升級(jí)或數(shù)據(jù)遷移方法研究
本文詳細(xì)論述了oracle數(shù)據(jù)庫升級(jí)的升級(jí)前的準(zhǔn)備、升級(jí)過程和升級(jí)后的測試與調(diào)整工作,并對(duì)各種升級(jí)方法在多種操作系統(tǒng)平臺(tái)上作了測試。2016-07-07Oracle 11g如何清理數(shù)據(jù)庫的歷史日志詳解
這篇文章主要給大家介紹了關(guān)于Oracle 11g如何清理數(shù)據(jù)庫歷史日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07Oracle之SQL語句性能優(yōu)化(34條優(yōu)化方法)
本篇文章主要介紹了Oracle之SQL語句性能優(yōu)化,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11教你如何通過PL/SQL創(chuàng)建序列和觸發(fā)器實(shí)現(xiàn)表自增字段
本文給大家分享如何通過PL/SQL創(chuàng)建序列和觸發(fā)器實(shí)現(xiàn)表自增字段,需要注意的是,在數(shù)據(jù)庫操作中,觸發(fā)器的使用對(duì)系統(tǒng)資源耗費(fèi)相對(duì)較大,考慮到大表操作的性能問題,?我們盡可能的減少觸發(fā)器的使用,改為直接手動(dòng)調(diào)用序列函數(shù)即可2022-11-11