oracle 分组排序后取第一条_关于oracle中位图索引的探讨:概念、原理、优缺点...
概述
oracle索引主要分為以下幾種:
1. b-tree索引
Oracle數(shù)據(jù)庫(kù)中最常見(jiàn)的索引類型是b-tree索引,也就是B-樹(shù)索引,以其同名的計(jì)算科學(xué)結(jié)構(gòu)命名。CREATE INDEX語(yǔ)句時(shí),默認(rèn)就是在創(chuàng)建b-tree索引。沒(méi)有特別規(guī)定可用于任何情況。
2. 位圖索引(bitmap index)
位圖索引特定于該列只有幾個(gè)枚舉值的情況,比如性別字段,標(biāo)示字段比如只有0和1的情況。
3. 基于函數(shù)的索引
比如經(jīng)常對(duì)某個(gè)字段做查詢的時(shí)候是帶函數(shù)操作的,那么此時(shí)建一個(gè)函數(shù)索引就有價(jià)值了。
4. 分區(qū)索引和全局索引
這2個(gè)是用于分區(qū)表的時(shí)候。前者是分區(qū)內(nèi)索引,后者是全表索引
5. 反向索引(REVERSE)
這個(gè)索引不常見(jiàn),但是特定情況特別有效,比如一個(gè)varchar(5)位字段(員工編號(hào))含值(10001,10002,10033,10005,10016..)
這種情況默認(rèn)索引分布過(guò)于密集,不能利用好服務(wù)器的并行
但是反向之后10001,20001,33001,50001,61001就有了一個(gè)很好的分布,能高效的利用好并行運(yùn)算。
6.HASH索引
HASH索引可能是訪問(wèn)數(shù)據(jù)庫(kù)中數(shù)據(jù)的最快方法,但它也有自身的缺點(diǎn)。集群鍵上不同值的數(shù)目必須在創(chuàng)建HASH集群之前就要知道。需要在創(chuàng)建HASH集群的時(shí)候指定這個(gè)值。使用HASH索引必須要使用HASH集群。
索引這么多,重點(diǎn)還是把握b-tree索引和位圖索引,今天先介紹下oracle的位圖索引。
什么是位圖索引
簡(jiǎn)單點(diǎn)就是用位圖表示的索引,oracle對(duì)于選擇度底的列的每個(gè)鍵值建立一個(gè)位圖,位圖中的每一位可能對(duì)應(yīng)多個(gè)列,位圖中位等于1表示特定的行含有此位圖表示的鍵值。
我們目前大量使用的索引一般主要是B-Tree索引,在索引結(jié)構(gòu)中存儲(chǔ)著鍵值和鍵值的RowID,并且是一一對(duì)應(yīng)的,而位圖索引主要針對(duì)大量相同值的列而創(chuàng)建(例如:類別,操作員,部門ID,庫(kù)房ID等),索引塊的一個(gè)索引行中存儲(chǔ)鍵值和起止Rowid,以及這些鍵值的位置編碼,位置編碼中的每一位表示鍵值對(duì)應(yīng)的數(shù)據(jù)行的有無(wú).一個(gè)位圖索引塊可能指向的是幾十甚至成百上千行數(shù)據(jù)的位置。
創(chuàng)建語(yǔ)法:
create bitmap index idx_bm_emp1_deptno on emp1(deptno);可以使用如下的 SQL 語(yǔ)句查詢數(shù)據(jù)庫(kù)中的所有位圖索引:
SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE='BITMAP';查詢?cè)?/h1>
由于索引是位圖,所以很多時(shí)候可以對(duì)這些索引中的位圖進(jìn)行位運(yùn)算-(and 和 or),這樣的速度明顯比b樹(shù)快(某些情況下)。由于位圖索引可以存儲(chǔ)null,所以可以直接通過(guò)位圖索引計(jì)數(shù)(肯定是準(zhǔn)確的)。
假設(shè)某個(gè)表T里所有的記錄在列C1上只具有三個(gè)值:01、02和03。在表T的C1列上創(chuàng)建位圖索引以后,則葉子節(jié)點(diǎn)的內(nèi)容如圖9-14所示。可以看到,位圖索引只有三個(gè)索引條目,也就是每個(gè)C1列的值對(duì)應(yīng)一個(gè)索引條目。位圖索引條目上還包含表里第一條記錄所對(duì)應(yīng)的ROWID以及最后一條記錄所對(duì)應(yīng)的ROWID。索引條目的最后一部分則是由多個(gè)bit位所組成的bitmap,每個(gè)bit位就對(duì)應(yīng)一條記錄。
位圖索引
當(dāng)發(fā)出where c1='01'這樣的SQL語(yǔ)句時(shí),oracle會(huì)去搜索01所在的索引條目,然后掃描該索引條目中的bitmap里所有的bit位。第一個(gè)bit位為 1,則說(shuō)明第一條記錄上的C1值為01,于是返回第一條記錄所在的ROWID(根據(jù)該索引條目里記錄的start ROWID加上行號(hào)得到該記錄所在的ROWID)。第二個(gè)bit位為0,則說(shuō)明第二條記錄上的C1值不為01,依此類推。另外,如果索引列為空,也會(huì)在位 圖索引里記錄,也就是將對(duì)應(yīng)的bit位設(shè)置為0即可。
如果索引列上不同值的個(gè)數(shù)比較少的時(shí)候,比如對(duì)于性別列(男或女)等,則使用位圖索引會(huì)比較好,因?yàn)樗鼘?duì)空間的占用非常少(因?yàn)槎际怯胋it位來(lái)表示表里 的數(shù)據(jù)行),從而在掃描索引的時(shí)候,掃描的索引塊的個(gè)數(shù)也比較少。
可以試想一下,如果在列的不同值非常多的列上,比如主鍵列上,創(chuàng)建位圖索引,則產(chǎn)生的索 引條目就等于表里記錄的條數(shù),同時(shí)每個(gè)索引條目里的bitmap里,只有一個(gè)1,其它都是0。這樣還不如B樹(shù)索引的效率高。 如果被索引的列經(jīng)常被 更新的話,則不適合使用位圖索引。因?yàn)楫?dāng)更新位圖所在的列時(shí),由于要在不同的索引條目之間修改bit位,比如將第一條記錄從01變?yōu)?2,則必須將01所 在的索引條目的第一個(gè)bit位改為0,再將02所在的索引條目的第一個(gè)bit位改為1。
因此,在更新索引條目的過(guò)程中,會(huì)鎖定位圖索引里多個(gè)索引條目。也就是同時(shí)只能有一個(gè)用戶能夠更新表T,從而降低了并發(fā)性。
位圖的優(yōu)點(diǎn)(主要針對(duì)dw)
1、減少即席查詢的相應(yīng)時(shí)間
2、和其它類型索引比較,真正節(jié)約了索引數(shù)據(jù)空間
3、即使在非常差的硬件上,也可能會(huì)有戲劇化的性能提升
4、高效的并行DML和LOAD操作。
5、生成索引的時(shí)候更高效,首先是不排序,其次是占用的空間少(索引空間)。
6、可以通過(guò)位圖索引直接計(jì)數(shù)。
位圖索引的缺點(diǎn)
1、不適合選擇度低的列
2、如果有比較頻繁的insert,update等操作,可能導(dǎo)致性能很底下,因?yàn)楦滤饕玫氖切墟i(可能鎖定多行),而不是排它鎖。
3、可能會(huì)溢出,索引數(shù)據(jù)塊難于放下整個(gè)索引值,這有可能導(dǎo)致低效。
總結(jié):
位圖索引是為數(shù)據(jù)倉(cāng)庫(kù)(也就是查詢環(huán)境設(shè)計(jì)的),位圖索引特別不適合OLTP系統(tǒng),位圖索引不適合與dml頻繁的環(huán)境,位圖索引適用于DSS系統(tǒng),位圖索引不適合頻繁修改的系統(tǒng),弊端是嚴(yán)重影響并發(fā)性,因?yàn)閡pdate索引列值的時(shí)候,會(huì)鎖定新值和舊值指向的所有數(shù)據(jù)行,所以使用位圖索引需慎重。
后面會(huì)分享更多DBA和devops方面的內(nèi)容,感興趣的朋友可以關(guān)注下!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的oracle 分组排序后取第一条_关于oracle中位图索引的探讨:概念、原理、优缺点...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python自动化办公知识点整理汇总_P
- 下一篇: SNMPWALK 命令「建议收藏」