新聞中心
導(dǎo)讀:關(guān)于Oracle數(shù)據(jù)庫(kù)中索引樹(shù)的結(jié)構(gòu)以及它們對(duì)Oracle性能調(diào)優(yōu)是否重要存在大量的、激烈的爭(zhēng)論,而且已經(jīng)有很多文章試圖來(lái)描述這些重要的Oracle性能工具的內(nèi)部工作機(jī)制。

創(chuàng)新互聯(lián)建站是一家專(zhuān)注于成都網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),達(dá)坂城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:達(dá)坂城等地區(qū)。達(dá)坂城做網(wǎng)站價(jià)格咨詢(xún):13518219792
正如我們知道的,Oracle提供了大量索引結(jié)構(gòu),每種索引結(jié)構(gòu)都有其好處和不足:
- B樹(shù)索引。從最早的Oracle發(fā)行版本開(kāi)始,Oracle就一直使用的標(biāo)準(zhǔn)樹(shù)索引就是B樹(shù)索引。
- 位圖索引。當(dāng)某個(gè)索引列含有很少數(shù)量的不同的值(即低基數(shù))時(shí),使用位圖索引。這對(duì)于那些只讀數(shù)據(jù)庫(kù)而言速度超快,但對(duì)需要經(jīng)常性更新的系統(tǒng)不適合。
- 位圖連接索引。這是針對(duì)來(lái)自其他表的數(shù)據(jù)列出現(xiàn)在某個(gè)連接表的多列索引時(shí)使用的索引。下面是在from子句和where子句中使用類(lèi)似SQL的創(chuàng)建索引的惟一語(yǔ)法。
以下是代碼片段:
- create bitmap index
- part_suppliers_state
- on
- inventory( parts.part_type, supplier.state )
- from
- inventory i,
- parts p,
- supplier s
- where
- i.part_id=p.part_id
- and
- i.supplier_id=p.supplier_id;
盡管有關(guān)索引重建的爭(zhēng)論仍在激烈進(jìn)行著,但還是存在每個(gè)人都認(rèn)可的索引管理的某些領(lǐng)域。在內(nèi)部機(jī)制上,一個(gè)Oracle B-樹(shù)索引的結(jié)構(gòu)和一個(gè)UNIX I-結(jié)點(diǎn)的結(jié)構(gòu)非常相似。索引中的每個(gè)數(shù)據(jù)塊都是索引樹(shù)中的一個(gè)結(jié)點(diǎn),位于***部的結(jié)點(diǎn)(葉數(shù)據(jù)塊)包含一對(duì)符號(hào)鍵和行ID值。
Oracle b-樹(shù)索引
為了正確管理這些數(shù)據(jù)塊,Oracle控制著每個(gè)數(shù)據(jù)塊中指針的分配。隨著一棵Oracle樹(shù)的增長(zhǎng)(通過(guò)往表里插入新行),Oracle會(huì)填充這個(gè)數(shù)據(jù)塊,當(dāng)這個(gè)數(shù)據(jù)塊滿(mǎn)時(shí)Oracle會(huì)分裂它,創(chuàng)建新的索引結(jié)點(diǎn)(數(shù)據(jù)塊)來(lái)管理索引內(nèi)的符號(hào)鍵。
因此,一個(gè)Oracle索引塊可能包含以下兩種類(lèi)型的指針:
- 指向其他索引結(jié)點(diǎn)(數(shù)據(jù)塊)的指針
- 指向數(shù)據(jù)庫(kù)表中特定行的行ID指針
Oracle管理著索引塊內(nèi)指針的分配,這就是為什么我們不能為索引指定一個(gè)PCTUSED值(自由列表重鏈接門(mén)檻)的原因。當(dāng)我們檢查一個(gè)索引塊的結(jié)構(gòu)時(shí),我們發(fā)現(xiàn)每個(gè)索引結(jié)點(diǎn)內(nèi)部條目的數(shù)量是下面兩個(gè)值的一個(gè)函數(shù):
1. 符號(hào)鍵的長(zhǎng)度
2. 索引表空間的塊尺寸
由于塊尺寸影響每個(gè)索引結(jié)點(diǎn)內(nèi)部的符號(hào)鍵的數(shù)量,可以推理出:塊尺寸對(duì)一棵索引樹(shù)的結(jié)構(gòu)也會(huì)有影響。在其他條件相同的情況下,采用32K的大數(shù)據(jù)塊能容納更多的符號(hào)鍵,從而能夠比在2K表空間中創(chuàng)建的相同的索引更加平整。采用大的數(shù)據(jù)塊也將減少索引訪問(wèn)期間一致獲取的數(shù)量,從而提高分散讀訪問(wèn)的性能。
索引中的每個(gè)數(shù)據(jù)塊包含索引樹(shù)中的“結(jié)點(diǎn)”,位于***部的結(jié)點(diǎn)(葉數(shù)據(jù)塊)包含一對(duì)符號(hào)鍵和行ID值。隨著一棵Oracle樹(shù)的增長(zhǎng)(通過(guò)往表里插入新行),Oracle會(huì)填充這個(gè)數(shù)據(jù)塊,當(dāng)這個(gè)數(shù)據(jù)塊滿(mǎn)時(shí)Oracle會(huì)分裂它,創(chuàng)建新的索引結(jié)點(diǎn)(數(shù)據(jù)塊)來(lái)管理索引內(nèi)的符號(hào)鍵。因此,一個(gè)Oracle索引塊可能包含指向其他索引結(jié)點(diǎn)或行ID/符號(hào)鍵對(duì)的指針。
索引行為和Oracle塊尺寸
由于塊尺寸影響每個(gè)索引結(jié)點(diǎn)內(nèi)部的符號(hào)鍵的數(shù)量,可以推理出:塊尺寸對(duì)一棵索引樹(shù)的結(jié)構(gòu)也會(huì)有影響。在其他條件相同的情況下,采用32K的大數(shù)據(jù)塊能容納更多的符號(hào)鍵,從而能夠比在2K表空間中創(chuàng)建的相同的索引更加平整。
今天,大多數(shù)Oracle性能調(diào)優(yōu)專(zhuān)家都利用Oracle提供的多種塊尺寸的特色,因?yàn)樗峁┝司彌_區(qū)隔離和以最合適塊尺寸來(lái)存放對(duì)象從而減少緩沖區(qū)浪費(fèi)的能力。一些Oracle基準(zhǔn)測(cè)試的世界記錄都使用很大的數(shù)據(jù)緩沖區(qū)和多種塊尺寸。
根據(jù)《Oracle數(shù)據(jù)庫(kù)管理員認(rèn)證:“Oracle 認(rèn)證數(shù)據(jù)庫(kù)管理專(zhuān)家”教師指南》一書(shū)的作者Christopher Foot的一篇文章,更大的塊尺寸在某些情況下非常有幫助:
“更大的塊尺寸意味著在B-樹(shù)索引的分支結(jié)點(diǎn)中有更多的空間來(lái)存儲(chǔ)符號(hào)鍵,從而可以降低樹(shù)的高度和提高索引查詢(xún)的性能?!?/p>
在任何情況下,似乎有證據(jù)表明塊尺寸影響樹(shù)的結(jié)構(gòu),這為數(shù)據(jù)塊影響樹(shù)的結(jié)構(gòu)提供了有力支持。
你可以使用大數(shù)據(jù)塊(16-32)緩沖區(qū)來(lái)存儲(chǔ)來(lái)自作為重復(fù)性大規(guī)模掃描對(duì)象的索引或表中的數(shù)據(jù)。這真的會(huì)提高性能么?一個(gè)小的但透漏內(nèi)情的測(cè)試能回答這個(gè)問(wèn)題。
#p#
在這個(gè)測(cè)試中,將對(duì)某個(gè)使用8K數(shù)據(jù)塊尺寸的Oracle 9i數(shù)據(jù)庫(kù)執(zhí)行以下查詢(xún),這個(gè)數(shù)據(jù)庫(kù)同時(shí)也使用16K緩沖區(qū)和16K大小的表空間。
以下是代碼片段:
- select
- count(*)
- from
- eradmin.admission
- where
- patient_id between 1 and 40000;
以下是代碼片段:
- Execution Plan
- SELECT STATEMENT Optimizer=CHOOSE
- (Cost=41 Card=1 Bytes=4)
- 1 0 SORT (AGGREGATE)
- 2 1 INDEX (FAST FULL SCAN) OF 'ADMISSION_PATIENT_ID'
- (NON-UNIQUE) (Cost=41 Card=120002 Bytes=480008)
以下是代碼片段:
- Statistics
- 0 recursive calls
- 0 db block gets
- 421 consistent gets
- 0 physical reads
- 0 redo size
- 371 bytes sent via SQL*Net to client
- 430 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
為了測(cè)試新的16K緩沖區(qū)和16K表空間的效果,將使用16K的表空間來(lái)重建這個(gè)查詢(xún)所用的索引,16K的表空間和原來(lái)的8K的表空間相比,除了更大的塊尺寸其他特性一模一樣。
以下是代碼片段:
- alter index
- eradmin.admission_patient_id
- rebuild nologging noreverse tablespace indx_16k;
一旦在16K表空間中建立好這個(gè)索引,就再次執(zhí)行這個(gè)查詢(xún)(同樣也是執(zhí)行兩次),會(huì)產(chǎn)生以下的運(yùn)行時(shí)統(tǒng)計(jì)信息:
以下是代碼片段:
- Statistics
- 0 recursive calls
- 0 db block gets
- 211 consistent gets
- 0 physical reads
- 0 redo size
- 371 bytes sent via SQL*Net to client
- 430 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
正如你所看到的,邏輯讀操作的次數(shù)被減少了一半,僅僅是由于使用了新的16K表空間和16K數(shù)據(jù)緩沖區(qū)。很顯然,正確使用新的數(shù)據(jù)緩沖區(qū)和Oracle9i及其以上版本的多種塊尺寸表空間的特色,很值得在你的數(shù)據(jù)庫(kù)中被試驗(yàn)和研究。
定期進(jìn)行索引重建?
爭(zhēng)論的另外一個(gè)領(lǐng)域是:是否存在一些確定的規(guī)則可以用來(lái)確定何時(shí)能夠從索引重建中獲取性能提高。許多使用Oracle的企業(yè)都定期進(jìn)行索引重建,并聲稱(chēng)在他們和重建他們的Oracle B-樹(shù)索引后獲得了相當(dāng)大的速度提升。
在“Oracle世界2003”上,展示了Sushil Kumar所著的一篇題為“Oracle數(shù)據(jù)庫(kù)10g:自我管理的數(shù)據(jù)庫(kù)”的文章,Kumar聲明說(shuō)Oracle10g的“自動(dòng)維護(hù)任務(wù)”(AMT)特色將自動(dòng)檢測(cè)并重建潛在的***化的索引。
“自動(dòng)工作負(fù)載信息庫(kù)(AWR)給oracle10g提供了關(guān)于數(shù)據(jù)庫(kù)各種使用情況的詳細(xì)信息。通過(guò)分析存儲(chǔ)在自動(dòng)工作負(fù)載信息庫(kù)(AWR)中的信息,10g數(shù)據(jù)庫(kù)可以決定是否需要執(zhí)行數(shù)據(jù)庫(kù)性能維護(hù)任務(wù),比如優(yōu)化器統(tǒng)計(jì)數(shù)字的刷新、重建索引等等。 以“自動(dòng)維護(hù)任務(wù)”AMT為基礎(chǔ),oracle數(shù)據(jù)庫(kù)可以自動(dòng)執(zhí)行這些操作?!?/p>
盡管如此,仍有不少反對(duì)定期重建索引的論點(diǎn)。一些oracle內(nèi)部的專(zhuān)家堅(jiān)持認(rèn)為oracle索引在空間重用和訪問(wèn)速度上是非常高效的,b-樹(shù)索引在極少情況下才需要被重建。他們堅(jiān)持認(rèn)為邏輯輸入輸出的減少應(yīng)該是可測(cè)量的,并且如果重建索引是有好處的,某些人應(yīng)該已經(jīng)提出了可以證明的規(guī)則。
結(jié)論
多種數(shù)據(jù)塊尺寸的特色能夠提高Oracle索引的性能,而且在某些情況下重建索引可以提高查詢(xún)速度,這是顯而易見(jiàn)的。人們期望新的Oracle10g“自動(dòng)維護(hù)任務(wù)”AMT允許自動(dòng)檢測(cè)并重建潛在的***化索引結(jié)構(gòu)。希望上文中涉及到的內(nèi)容對(duì)大家能夠有所幫助。
【編輯推薦】
- Oracle數(shù)據(jù)庫(kù)關(guān)閉方法總結(jié)
- Oracle數(shù)據(jù)庫(kù)效率技巧:避免錯(cuò)誤的索引
- ORACLE實(shí)例和ORACLE數(shù)據(jù)庫(kù)詳解
- Oracle數(shù)據(jù)庫(kù)基本常識(shí)
文章題目:Oracle數(shù)據(jù)庫(kù)中索引樹(shù)的結(jié)構(gòu)與塊尺寸
文章URL:http://www.dlmjj.cn/article/dhsceop.html


咨詢(xún)
建站咨詢(xún)
