李凡

摘 要: 在Oracle數(shù)據(jù)庫(kù)中為了優(yōu)化數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu),提高查詢的效率,很有必要進(jìn)行數(shù)據(jù)庫(kù)的索引與約束設(shè)置,本文就幾種常用的索引與約束進(jìn)行介紹與探討,結(jié)合大數(shù)據(jù)系統(tǒng)的開(kāi)發(fā),針對(duì)性地提出加強(qiáng)數(shù)據(jù)庫(kù)配置的必要性。
關(guān)鍵詞: Oracle;索引;約束
一、索引的概念
索引是Oracle的一個(gè)對(duì)象,索引中存儲(chǔ)了特定列的排序數(shù)據(jù),實(shí)現(xiàn)對(duì)表的快速訪問(wèn)。使用索引可以很快查找到建立索引時(shí)列的值所在的行,而不必對(duì)表實(shí)現(xiàn)全表掃描,所以適當(dāng)?shù)氖褂盟饕梢詼p少磁盤I/O量。
二、建立索引的方式
建立索引的方式有很多種,從建立索引到查看索引,通過(guò)參數(shù)命令執(zhí)行,常用的索引有以下幾種,大致介紹如下:
1、B-樹(shù)索引:它是Oracle默認(rèn)的索引類型,位圖索引與反向鍵索引建立在其基礎(chǔ)之上。B-樹(shù)索引結(jié)構(gòu)有三個(gè)基本組成部分:根節(jié)點(diǎn)、分支結(jié)點(diǎn)和葉子節(jié)點(diǎn),其中根節(jié)點(diǎn)位于索引結(jié)構(gòu)的最頂端,而葉子節(jié)點(diǎn)位于索引結(jié)構(gòu)的最低端,中間為分支節(jié)點(diǎn)。B-樹(shù)索引的特點(diǎn)是平衡性強(qiáng),不會(huì)因?yàn)閿?shù)據(jù)變更操作影響索引性能。B-樹(shù)索引結(jié)構(gòu)圖如下所示。
2、位圖索引:它是大數(shù)據(jù)支持的索引機(jī)制,適用于沒(méi)有大量更新任務(wù)的數(shù)據(jù)倉(cāng)庫(kù),因?yàn)槲粓D索引里的關(guān)聯(lián)數(shù)據(jù)太多,所以有大量數(shù)據(jù)更新時(shí),位圖索引需做大量的更改,系統(tǒng)開(kāi)銷較大,位圖索引比較適合精確性查找。創(chuàng)建位圖索引的實(shí)例如下
SQL> create bitmap index emp
2 on emp(job);
索引已創(chuàng)建。
3、反向鍵索引:它是指在創(chuàng)建索引的過(guò)程中對(duì)索引列創(chuàng)建的索引鍵值的字節(jié)反向,以避免查找的無(wú)序。使用反向鍵索引使得每個(gè)鍵值被顛倒順序,將序列性的鍵值分散開(kāi),使得鍵值平衡地保存在葉子節(jié)點(diǎn)中。創(chuàng)建反向鍵索引需要使用REVERSE關(guān)鍵字,實(shí)例如下
SQL> create index emp
2 on emp(sal) reverse;
索引已創(chuàng)建。
4、基于函數(shù)的索引:在用戶查詢數(shù)據(jù)時(shí),如果查詢語(yǔ)句的WHERE字句中有函數(shù)存在,Oracle使用函數(shù)索引將加快查詢速度,基于函數(shù)的索引,使用表的列函數(shù)值作為鍵值建立索引結(jié)構(gòu)。以下是通過(guò)UPPER函數(shù)創(chuàng)建基于函數(shù)的索引實(shí)例。
SQL> create index dept
2 on dept(UPPER(dname));
索引已創(chuàng)建。
索引建立后,還需監(jiān)控索引,索引不完整,還要重建索引,索引不用,要?jiǎng)h除索引,這一系列操作,構(gòu)成了索引的體系。
三、約束的概念
Oracle引入約束的目的是保證插入表的數(shù)據(jù)滿足一定的要求,這個(gè)要求可以理解為業(yè)務(wù)規(guī)則的聲明,約束作為數(shù)據(jù)定義的一部分,所以它是聲明性的,而不是過(guò)程性的,這種簡(jiǎn)單的業(yè)務(wù)規(guī)則便于編寫代碼與維護(hù)。使用約束比在應(yīng)用程序中使用規(guī)則驗(yàn)證更有效,執(zhí)行速度更快。
四、約束的分類
約束按照功能可以分為五種,對(duì)于每種的特點(diǎn)大致進(jìn)行介紹如下。
1、非空約束:該約束不允許某列為NULL,例如某員工表EMP中,員工號(hào)是不允許為空,即要求員工號(hào)必須存在且為數(shù)字類型NUMBER,在表EMP的定義過(guò)程中已定義了非空約束。通過(guò)數(shù)據(jù)字典可以清楚地查詢約束信息。
2、主鍵約束:該約束和唯一鍵約束很相似,但是主鍵約束不允許插入空值NULL,主鍵唯一標(biāo)識(shí)一個(gè)表的記錄,主鍵可以在一列或多列上創(chuàng)建。對(duì)于創(chuàng)建主鍵約束,可以通過(guò)對(duì)該列插入重復(fù)值進(jìn)行驗(yàn)證,如果主鍵約束結(jié)果唯一且不能為空,說(shuō)明約束正確。
3、唯一約束:該約束要求列的值在表中是唯一的,但是可以插入空值NULL,也就是說(shuō)表中某列的值不能重復(fù),以確保數(shù)據(jù)的唯一性。數(shù)據(jù)的唯一性在數(shù)據(jù)庫(kù)操作中可以避免查找的誤判與數(shù)據(jù)有效性規(guī)則的制定。
4、條件約束:該約束是比較靈活的一類約束,可以根據(jù)需要對(duì)表設(shè)置更多的規(guī)則限制,條件約束說(shuō)明表中每一行的某列或幾列的數(shù)據(jù)必須滿足的條件。條件約束可以使用一個(gè)或多個(gè)約束條件,可以在單一條件約束中使用復(fù)合條件,也可以對(duì)同一列使用多個(gè)條件約束。條件約束的判斷標(biāo)準(zhǔn)是條件約束的返回值,TRUE表示滿足條件,F(xiàn)ALSE表示不滿足條件,拒絕執(zhí)行。條件約束可以在創(chuàng)建表時(shí)創(chuàng)建,也可以在表創(chuàng)建完成后對(duì)某列創(chuàng)建。
5、外鍵約束:該約束不僅僅涉及一個(gè)表,它還涉及主表和從表,使用外鍵約束使得Oracle可以維護(hù)主表和從表之間的引用完整性。簡(jiǎn)單地說(shuō),如果要插入從表的一行數(shù)據(jù),則某列的值要參考主表中引用參考的值,而不能無(wú)限制地插入記錄。
五、兩者的維護(hù)
索引的維護(hù)就是修改索引的各種參數(shù),在維護(hù)索引前先需知道當(dāng)前索引的參數(shù)位置,再根據(jù)設(shè)置進(jìn)行參數(shù)的調(diào)整,以下是索引參數(shù)的修改實(shí)例。
SQL>alter index emp
2 rebuild
3 pctfree 30
4 storage (next 100k);
通過(guò)對(duì)pctfree參數(shù)的修改,適當(dāng)增加存儲(chǔ)空間,這樣可以合并索引碎片,維護(hù)磁盤空間,有利于系統(tǒng)開(kāi)銷后的釋放。
約束的維護(hù)包括約束的完整性設(shè)置與約束的更改操作,尤其是刪除約束性操作普遍,該操作隨時(shí)進(jìn)行,要求用戶具有刪除約束的條件并知道約束的名字,一般可以通過(guò)數(shù)據(jù)字典USER來(lái)查找約束的名字,進(jìn)而使用DROP指令刪除約束,通過(guò)以下實(shí)例說(shuō)明。
SQL>alter table emp
2 drop constraint SYS
通過(guò)該指令,刪除表emp的唯一約束。
六、系統(tǒng)評(píng)價(jià)
索引已經(jīng)成為關(guān)系數(shù)據(jù)庫(kù)非常重要的部分。它們被用作包含所關(guān)心數(shù)據(jù)的表指針。通過(guò)一個(gè)索引,能從表中直接找到一個(gè)特定的記錄,而不必連續(xù)順序掃描這個(gè)表,一次一個(gè)地去查找。對(duì)于大的表,索引是必要的。當(dāng)然索引需要占物理空間,對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度。所以并非所有的數(shù)據(jù)庫(kù)都以相同的方式使用索引。作為通用規(guī)則,只有當(dāng)經(jīng)常查詢索引列中的數(shù)據(jù)時(shí),才需要在表上創(chuàng)建索引。索引占用磁盤空間,并且降低添加、刪除和更新行的速度。如果應(yīng)用程序非常頻繁地更新數(shù)據(jù)或磁盤空間有限,則可能需要限制索引的數(shù)量。在表較大是在建立索引,表中的數(shù)據(jù)越多,索引的優(yōu)越性越明顯。
數(shù)據(jù)庫(kù)約束是為了保證數(shù)據(jù)的完整性而實(shí)現(xiàn)的一套機(jī)制,它具體的根據(jù)各個(gè)不同的數(shù)據(jù)庫(kù)的實(shí)現(xiàn)而有不同的工具,所以我們?cè)趯W(xué)習(xí)約束的時(shí)候就會(huì)看到域完整性(Domain Integrity)、實(shí)體完整性(Entity Integrity)、參照完整性(Referential Integrity)與用戶定義完整性(User-defined Integrity)的不同的約束分類。約束能夠提高Oracle數(shù)據(jù)庫(kù)操作的穩(wěn)定性與查詢效率,對(duì)于數(shù)據(jù)挖掘等高端操作起到一定的保障作用。
總之,隨著大數(shù)據(jù)的開(kāi)發(fā),數(shù)據(jù)庫(kù)的優(yōu)化配置也在不斷地進(jìn)行調(diào)整,索引與約束會(huì)深層次地進(jìn)行改變,以適應(yīng)將來(lái)數(shù)據(jù)庫(kù)的要求。
參考文獻(xiàn)
[1] 魏科科. 基于Oracle數(shù)據(jù)庫(kù)的索引優(yōu)化[J]. 電腦知識(shí)與技術(shù),2015,10.
[2] 裘志華. 基于Oracle數(shù)據(jù)庫(kù)的完整性約束[J].電子商務(wù),2015,4.
[3] 劉超,張明安. 基于Oracle數(shù)據(jù)庫(kù)系統(tǒng)的研究[J]. 軟件,2016,4.endprint