Oracle對(duì)象教程:索引(Index)創(chuàng)建使用,索引:對(duì)數(shù)據(jù)庫(kù)表中的某些列進(jìn)行排序,便于提高查詢效率。
當(dāng)我們?cè)谀潮緯胁檎姨囟ǖ恼鹿?jié)內(nèi)容時(shí),可以先從書的目錄著手,找到該章節(jié)所在的頁(yè)碼,然后快速的定位到該頁(yè)。這種做法的前提是頁(yè)面編號(hào)是有序的。如果頁(yè)碼無(wú)序,就只能從第一頁(yè)開(kāi)始,一頁(yè)頁(yè)的查找了。
數(shù)據(jù)庫(kù)中索引(Index)的概念與目錄的概念非常類似。如果某列出現(xiàn)在查詢的條件中,而該列的數(shù)據(jù)是無(wú)序的,查詢時(shí)只能從第一行開(kāi)始一行一行的匹配。創(chuàng)建索引就是對(duì)某些特定列中的數(shù)據(jù)排序,生成獨(dú)立的索引表。在某列上創(chuàng)建索引后,如果該列出現(xiàn)在查詢條件中,Oracle會(huì)自動(dòng)的引用該索引,先從索引表中查詢出符合條件記錄的ROWID,由于ROWID是記錄的物理地址,因此可以根據(jù)ROWID快速的定位到具體的記錄,表中的數(shù)據(jù)非常多時(shí),引用索引帶來(lái)的查詢效率非常可觀。
·如果表中的某些字段經(jīng)常被查詢并作為查詢的條件出現(xiàn)時(shí),就應(yīng)該考慮為該列創(chuàng)建索引。
·當(dāng)從很多行的表中查詢少數(shù)行時(shí),也要考慮創(chuàng)建索引。有一條基本的準(zhǔn)則是:當(dāng)任何單個(gè)查詢要檢索的行少于或者等于整個(gè)表行數(shù)的10%時(shí),索引就非常有用。
Oracle數(shù)據(jù)庫(kù)會(huì)為表的主鍵和包含唯一約束的列自動(dòng)創(chuàng)建索引。索引可以提高查詢的效率,但是在數(shù)據(jù)增刪改時(shí)需要更新索引,因此索引對(duì)增刪改時(shí)會(huì)有負(fù)面影響。
語(yǔ)法結(jié)構(gòu):創(chuàng)建索引
CREATE [UNIQUE] INDEX index_name ON?
table_name(column_name[,column_name…])
語(yǔ)法解析:
1. UNIQUE:指定索引列上的值必須是唯一的。稱為唯一索引。
2. index_name:指定索引名。
3. tabl_name:指定要為哪個(gè)表創(chuàng)建索引。
4. column_name:指定要對(duì)哪個(gè)列創(chuàng)建索引。我們也可以對(duì)多列創(chuàng)建索引;這種索引稱為組合索引。
案例4:為EMP表的ENAME列創(chuàng)建創(chuàng)建唯一索引,為EMP表的工資列創(chuàng)建普通索引,把JOB列先變?yōu)樾懺賱?chuàng)建索引。
代碼演示:創(chuàng)建索引
SQL> CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME); ?①
Index created
SQL> CREATE INDEX IDX_SAL ON EMP(SAL); ?②
Index created
SQL> CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));??③
Index created
代碼解析:
① 為SCOTT.EMP表的ENAME列創(chuàng)建唯一索引。
② 為SCOTT.EMP表的SAL列創(chuàng)建索引。
③ 在查詢中可能經(jīng)常使用job的小寫作為條件的表達(dá)式,因此創(chuàng)建索引時(shí),可以先對(duì)JOB列中的所有值轉(zhuǎn)換為小寫后創(chuàng)建索引,而這時(shí)需要使用lower函數(shù),這種索引稱為基于函數(shù)的索引。
在select語(yǔ)句查詢時(shí),Oracle系統(tǒng)會(huì)自動(dòng)為查詢條件上的列應(yīng)用索引。索引就是對(duì)某一列進(jìn)行排序,因此在索引列上,重復(fù)值越少,索引的效果越明顯。
Oracle可以為一些列值重復(fù)非常多且值有限的列(比如性別列)上創(chuàng)建位圖索引。關(guān)于Oracle更多的索引類型(比如反向鍵索引等),請(qǐng)參考Oracle官方文檔。