Oracle 是以高級結構化查詢語言(SQL)為基礎的大型關系數據庫,通俗地講它是用方便邏輯管理的語言操縱大量有規律數據的集合。是目前最流行的客戶/服務器(CLIENT/SERVER)體系結構的數據庫之一,我們當然希望能夠更加快速的訪問數據庫.我們在看書的時候為了更加迅速的找到我們關心的內容,首先我們會去看目錄, 正如書籍目錄有助於讀者更快地找到信息一樣,Oracle表中的索引也有助於更快地檢索到數據。如果應用程序運行較慢,設計巧妙的索引將會加快其速度。
表( Ta b l e )是存放用戶數據的數據庫對象。每個表的信息放在數據字典中,O r a c l e使用數據字典來保證將正確類型的數據(如數字或字符)放到O r a c l e表中。形象的比喻是填表比作一個電子表格,電子表格中的單元( C e l l )相當於表中的表列。和電子表格中的單元一樣,表中的表列也有相應的數據類型。如果定義電子表格中某個單元為數字數據類型,則在此單元中不能存放字符。表中的表列也是一樣,類型為數字的表列不接收字符. 索引(Index) 是表的小型化拷貝,表的索引項允許O r a c l e快速訪問表中的數據。提示合理構造表索引有助於提高數據庫查詢速度。
根據我們的經驗:如果把索引視為一個小表,將有助於理解索引的工作方式。設想有下
面的表(其中省略號表示還有表列從d到z未寫出,該表應共有26個表列):
(c) Copyright 1999 Oracle Corporation. All rights reserved
Connected to:
Oracle8i Enterprise Edition Release 8.1.5.0.0 - Production
With the Partitioning and Java options
PL/SQL Release 8.1.5.0.0 - Production
SQL> create table sample_3
2 (a varchar2(30) ,
3 b varchar2(30),
4 c varchar2(30),
……
Table created
每當需要讀取存在表列c中的數據時, O r a c l e系統必須也把保存在表列a、b以及d到z中的數據取出。計算機資源有限,每次進行這種操作時,對一次取出的信息量都有限制。為理
解上述所說的限制,假設O r a c l e 8 i發出從s a m p l e _ 3取數據的請求,內存限制要求每次最多能取出與四行表數據所占空間等量的信息。如表1所示,定義了一個3,1 2 0個字符的讀緩沖區。
Columns retrIEved C R 2 6
Rows retrIEved R R 4
Buffer size CL*CR*CR = 3,120
即使只希望了解存放在表列c中的信息,數據庫也會被迫取出存放在其他表列中的數據。
有一種解決此問題的方法就是使用索引( i n d e x )。用S Q L語句create index colc_ind on
s a m p l e _ 3 ( c o l c );在表列c上建一個索引, O r a c l e根據此命令建立索引對象。用戶可以將索引想像為只保存表s a m p l e _ 3的表列c中信息的一個小表。此外,使用索引檢索出的信息最終也需s a m p l e _ 3中取出,這兩個表就像一對雙胞胎,對其中一個表所做的操作也影響另一個表。如果從主表s a m p l e _ 3中刪除表列c的一項,則索引表中的相應項也被刪除。
假設用戶只想查詢表s a m p l e _ 3的c表列中的數據, O r a c l e知道索引表中存放的數據可以解決此問題。因此, O r a c l e不直接浏覽s a m p l e _ 3,而只查看索引表中的內容。O r a c l e進行同樣的物理讀操作,一次讀操作的內存限制同樣也為3 1 2 0個字符。使用剛建立的索引, O r a c l e只要取出表列c中數據即可。這時, O r a c l e一次就可以讀取1 0 4個記錄( 1 0 4×3 0=3 1 3 0 )到內存緩沖區中,
如.表2所示。
Column length CL 30
Columns retrIEved CR 1
Rows retrIEved CL/CR*BU = 104
索引只包括表中用來建索引的表列的信息,不包括表中所有表列的信息。同樣的一次讀操作可以取回更多用戶關心的信息。而且僅限於用戶所關心的信息,表中別的表列的信息根本不用去管。索引是如此的重要,所以在介紹下一部分內容前,我們還要了解索引的另外一些特點和用途.
根據設計,存儲在關系數據庫中的數據並無特別的順序,插入的記錄保存在下一個可用
位置中。這樣,當用戶發布一條S Q L語句查看特定日期或日期范圍的記錄時(例如:s e l e c t
from state where state_cd=' M A ';),O r a c l e系統需要遍歷表中所有的行。另一方面,索引帶有順序號。如果用戶在表中有一個日期類型的表列,可以在此表列上建一個索引。O r a c l e所建的索引中所有的數據都是排了序的。O r a c l e在索引上查找特定日期的數據並把信息返回給用戶顯然要快得多.
用戶可以建立兩種類型的索引:唯一性索引(Unique Index)和非唯一性索引( N o n u n i q u eI n d e x )。唯一性索引不允許數據重復,非唯一性索引允許。正如前面提及,索引和相應的表是一對雙胞胎。如果對表中的表列c建立唯一性索引,則每當准備將一行數據插人實際的表之前,系統總要檢查索引以確保表列c中數據的唯一性。S Q L語句create index colc_ind on
s a m p l e _ 3 ( c o l c );用於建立非唯一索引,而create unique index colc_ind on sample_3
t a b l e ( c o l c );則用於建立唯一性索引。
O r a c l e允許用戶建立並聯索引,這種索引針對多個表列。用前面例子來說明這個問題。很多時候,用戶在查看表列a時必定也要查看表列b和表列c。這時,就可以對此二表列建立並
聯索引。建立並聯索引的S Q L語句為create index colabc_ind on sample_3 table(cola,c o l b,c o l c );,O r a c l e8i管理此索引的方法與管理單表列索引的方法完全一樣
當用戶編寫查詢語句有經驗後,將會發現自己越來越願意在S Q L語句中使用索引來處理查詢。
利用好索引我們就可以快速訪問O r a c l e8i數據庫.