溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

oracle 性能優(yōu)化

發(fā)布時(shí)間:2020-08-10 08:26:14 來源:ITPUB博客 閱讀:113 作者:mcxiaoracle 欄目:關(guān)系型數(shù)據(jù)庫

索引的說明

索引是與表相關(guān)的一個(gè)可選結(jié)構(gòu),在邏輯上和物理上都獨(dú)立于表的數(shù)據(jù),索引能優(yōu)化查詢,不能優(yōu)化DML操作,Oracle自動(dòng)維護(hù)索引,頻繁的DML操作反而會(huì)引起大量的索引維護(hù)。

通常,為檢索表數(shù)據(jù),數(shù)據(jù)庫以交替方式先讀取索引塊,然后讀取相應(yīng)的表塊。

1 大表,返回的行數(shù)<5%

2 經(jīng)常使用where子句查詢的列

3 離散度高的列

4 更新鍵值代價(jià)低

5 邏輯AND、OR效率高

6 查看索引在建在那表、列:

   select * from user_indexes;

   select * from user_ind_columns;

oracle  索引結(jié)構(gòu):

索引結(jié)構(gòu)

oracle索引分為兩大類結(jié)構(gòu):

B樹索引結(jié)構(gòu)<balance>

類似于字典查詢,最后到leaf block ,存的是數(shù)據(jù)rowid和數(shù)據(jù)項(xiàng)

oracle  性能優(yōu)化

1.葉塊之間使用雙向鏈連接,為了可以范圍查詢。

2.刪除表行時(shí),索引葉塊也會(huì)更新,但只是邏輯更改,并不做物理的刪除葉塊。

3.索引葉塊不保存表行鍵值null的信息。

位圖索引結(jié)構(gòu)<bitmap>

在oracle中是根據(jù)rowid來定位記錄的,因此,我們需要引入start rowid和end rowid,通過start rowid ,end rowid 和二進(jìn)制位的偏移,我們就可以非??焖俚挠?jì)算出二進(jìn)制位所代表的表記錄rowid。位圖索引的最終邏輯結(jié)構(gòu)如下圖:

oracle  性能優(yōu)化

我們稱每一單元的<key ,startrowid,end rowid,bitmap>為一個(gè)位圖片段。當(dāng)我們修改某一行數(shù)據(jù)的時(shí)候,我們需要鎖定該行列值所對(duì)應(yīng)的位圖片段,如果我們進(jìn)行的是更新操作,同時(shí)還會(huì)鎖定更新后新值所在的位圖片段。例如我們將列值從01修改為03,就需要同時(shí)鎖定01和03位圖片段,此時(shí)如果有其他用戶需要修改與01或者03關(guān)聯(lián)的表記錄上的索引字段,就會(huì)被阻塞,因此位圖索引不適合并發(fā)環(huán)境,在并發(fā)環(huán)境下可能會(huì)造成大量事務(wù)的阻塞。

建立索引的方式:

1.唯一索引:鍵值不重復(fù)

create unique index doctor_index on t_doctor(empno)

drop index doctor_index

2.一般索引:鍵值可重復(fù)

create index doctor_index on t_doctor(empno)

drop index doctor_index

3.復(fù)合索引:綁定了多個(gè)列

create index doctor_index on t_doctor(empno,job)

drop index doctor_index

4.反向索引:為避免平衡樹索引熱塊,如t_doctor表中empno開頭都是“7”,這樣構(gòu)建索引樹的時(shí)候,很可能會(huì)把所有數(shù)據(jù)分配到一個(gè)塊里,使用反向索引,避免此類問題,使索引樹分布均勻

create index doctor_index on t_doctor(empno) reverse

drop index doctor_index

5.函數(shù)索引:查詢時(shí)必須用到這個(gè)函數(shù),才會(huì)使用到

create index func_index on t_doctor(lower(empno))

--select * from t_doctor where lower(empno) = 'lina'

drop index func_index 

6.壓縮索引:不常用

create index doctor_index on t_doctor(empno) compress

drop index doctor_index

7.升序降序索引:

create index doctor_index on t_doctor(empno desc, job asc)

drop index doctor_index

索引碎片問題

由于對(duì)基表做DML操作, 導(dǎo)致索引表塊的自動(dòng)更改操作,尤其是基表的delete操作會(huì)引起index表的index_entries的邏輯刪除,注意只有當(dāng)一個(gè)索引塊中的全部index_entry都被刪除了,才會(huì)把這個(gè)索引塊刪除,索引對(duì)基表的delete、insert操作都會(huì)產(chǎn)生索引碎片問題。

在Oracle文檔里并沒有清晰的給出索引碎片的量化標(biāo)準(zhǔn),Oracle建議通過Segment Advisor(段顧問)解決表和索引的碎片問題,如果你想自行解決,可以通過查看index_stats視圖,當(dāng)以下三種情形之一發(fā)生時(shí),說明積累的碎片應(yīng)該整理了(僅供參考)。

  查看執(zhí)行計(jì)劃:set autotrace traceonly explain;

analyze index ind_1 validate structure;

select name,HEIGHT,PCT_USED,DEL_LF_ROWS/LF_ROWS from index_stats;

1.HEIGHT >=4   

2 PCT_USED< 50%   

3 DEL_LF_ROWS/LF_ROWS>0.2

alter index ind_1 rebuild [online] [tablespace name];


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI