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