oracle 索引的相關(guān)介紹(創(chuàng)建、簡(jiǎn)介、技巧、怎樣查看) .
更新時(shí)間:2014年06月05日 16:22:00 作者:
索引是通過一組排序后的索引鍵來取代默認(rèn)的全表掃描檢索方式,從而提高檢索效率
一、索引簡(jiǎn)介
1、索引相當(dāng)于目錄
2、索引是通過一組排序后的索引鍵來取代默認(rèn)的全表掃描檢索方式,從而提高檢索效率。
3、索引的創(chuàng)建要適度,多了會(huì)影響增刪改的效率,少了會(huì)影響查詢的效率,索引最好創(chuàng)建在取值分散的列上,避免對(duì)同一張表創(chuàng)建過多的索引
4、索引的使用對(duì)用戶來說是透明的,由系統(tǒng)來決定什么時(shí)候使用索引。
5、Oracle支持多種類型的索引,可以按列的多少、索引值是否唯一和索引數(shù)據(jù)的組織形式對(duì)索引進(jìn)行分類,以滿足各種表和查詢條件的要求。(請(qǐng)見附件)
a. 單列索引和復(fù)合索引
b.B樹索引(create index時(shí)默認(rèn)的類型)
B樹索引中所有葉子節(jié)點(diǎn)都具有相同的深度,所以不管查詢條件如何,查詢速度基本相同。另B樹索引能夠適應(yīng)各種查詢條件,包括精確查詢、模糊查詢和比較查詢
--Unique 唯一索引 值唯一,但允許存在null,主鍵默認(rèn)存在唯一索引,但列不能為null
--Non-Unique:非唯一索引,其索引值可以重復(fù),允許為NULL。默認(rèn)情況下,Oracle創(chuàng)建的索引是非唯一索引
--Reverse Key:反向關(guān)鍵字索引。通過在創(chuàng)建索引時(shí)指定“REVERSE”關(guān)鍵字,可以創(chuàng)建反向關(guān)鍵字索引,被索引的每個(gè)數(shù)據(jù)列中的數(shù)據(jù)都是反向存儲(chǔ)
的,但仍然保持原來數(shù)據(jù)列的次序
c.位圖索引(對(duì)列值范圍少,如性別 政治面貌適用,而不是默認(rèn)的B樹索引)
c.函數(shù)索引
當(dāng)需要經(jīng)常訪問一些函數(shù)或表達(dá)式時(shí),可以將其存儲(chǔ)在索引中,當(dāng)下次訪問時(shí),由于該值已經(jīng)計(jì)算出來了,因此,可以大大提高那些在WHERE子句中包含該函數(shù)或
表達(dá)式的查詢操作的速度;
函數(shù)索引既可以使用B樹索引,也可以使用位圖索引。
二、管理索引的原則
使用索引應(yīng)該遵循以下一些基本的原則。
1.小表不需要建立索引。
2.對(duì)于大表而言,如果經(jīng)常查詢的記錄數(shù)目少于表中總記錄數(shù)目的15%時(shí),可以創(chuàng)建索引。這個(gè)比例并不絕對(duì),它與全表掃描速度成反比。
3.對(duì)于大部分列值不重復(fù)的列可建立索引。
4.對(duì)于基數(shù)大的列,適合建立B樹索引,而對(duì)于基數(shù)小的列適合建立位圖索引。
5.對(duì)于列中有許多空值,但經(jīng)常查詢所有的非空值記錄的列,應(yīng)該建立索引。
6.LONG和LONG RAW列不能創(chuàng)建索引。
7.經(jīng)常進(jìn)行連接查詢的列上應(yīng)該創(chuàng)建索引。
8.在使用CREATE INDEX語句創(chuàng)建查詢時(shí),將最常查詢的列放在其他列前面。
9.維護(hù)索引需要開銷,特別時(shí)對(duì)表進(jìn)行插入和刪除操作時(shí),因此要限制表中索引的數(shù)量。對(duì)于主要用于讀的表,則索引多就有好處,但是,一個(gè)表如果經(jīng)常被更改,則索引應(yīng)少點(diǎn)。
10.在表中插入數(shù)據(jù)后創(chuàng)建索引。如果在裝載數(shù)據(jù)之前創(chuàng)建了索引,那么當(dāng)插入每行時(shí),Oracle都必須更改每個(gè)索引。
三、LONG類型(可存儲(chǔ)2G)主要用于不需要作字符串搜索的長(zhǎng)串?dāng)?shù)據(jù),如果要進(jìn)行字符搜索就要用varchar2類型,存儲(chǔ)這么長(zhǎng)的請(qǐng)使用 pstat1.setCharacterStream()方法,資料見附件P26
四、創(chuàng)建索引語法如下
CREATE INDEX語句的語法如下:
CREATE [UNIQUE] | [BITMAP] INDEX index_name
ON table_name([column1 [ASC|DESC],column2
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]
[STORAGE (INITIAL n2)]
[NOLOGGING]
[NOLINE]
[NOSORT];
五、
1、查看索引信息可以在 all_indexs 表中
2、查看索引信息及引用的列 all_ind_columns
3、查看函數(shù)索引信息 all_ind_expressions
4、oracle比較智能,有時(shí)候即使創(chuàng)建了索引也不會(huì)使用,比如說在數(shù)據(jù)量比較少的情況下,可能就不會(huì)用索引
5、當(dāng)進(jìn)行全表掃描的時(shí)候,不用索引效率會(huì)更好
6、查詢可能會(huì)使用緩存,所以說如果發(fā)現(xiàn)執(zhí)行速度變快了,不一定說明你的sql更優(yōu)了,有可能是使用到了緩存而已
7、使用plsql中的“解釋計(jì)劃”功能可以比較執(zhí)行計(jì)劃的消耗,進(jìn)而寫出更優(yōu)的sql
1、索引相當(dāng)于目錄
2、索引是通過一組排序后的索引鍵來取代默認(rèn)的全表掃描檢索方式,從而提高檢索效率。
3、索引的創(chuàng)建要適度,多了會(huì)影響增刪改的效率,少了會(huì)影響查詢的效率,索引最好創(chuàng)建在取值分散的列上,避免對(duì)同一張表創(chuàng)建過多的索引
4、索引的使用對(duì)用戶來說是透明的,由系統(tǒng)來決定什么時(shí)候使用索引。
5、Oracle支持多種類型的索引,可以按列的多少、索引值是否唯一和索引數(shù)據(jù)的組織形式對(duì)索引進(jìn)行分類,以滿足各種表和查詢條件的要求。(請(qǐng)見附件)
a. 單列索引和復(fù)合索引
b.B樹索引(create index時(shí)默認(rèn)的類型)
B樹索引中所有葉子節(jié)點(diǎn)都具有相同的深度,所以不管查詢條件如何,查詢速度基本相同。另B樹索引能夠適應(yīng)各種查詢條件,包括精確查詢、模糊查詢和比較查詢
--Unique 唯一索引 值唯一,但允許存在null,主鍵默認(rèn)存在唯一索引,但列不能為null
--Non-Unique:非唯一索引,其索引值可以重復(fù),允許為NULL。默認(rèn)情況下,Oracle創(chuàng)建的索引是非唯一索引
--Reverse Key:反向關(guān)鍵字索引。通過在創(chuàng)建索引時(shí)指定“REVERSE”關(guān)鍵字,可以創(chuàng)建反向關(guān)鍵字索引,被索引的每個(gè)數(shù)據(jù)列中的數(shù)據(jù)都是反向存儲(chǔ)
的,但仍然保持原來數(shù)據(jù)列的次序
c.位圖索引(對(duì)列值范圍少,如性別 政治面貌適用,而不是默認(rèn)的B樹索引)
c.函數(shù)索引
當(dāng)需要經(jīng)常訪問一些函數(shù)或表達(dá)式時(shí),可以將其存儲(chǔ)在索引中,當(dāng)下次訪問時(shí),由于該值已經(jīng)計(jì)算出來了,因此,可以大大提高那些在WHERE子句中包含該函數(shù)或
表達(dá)式的查詢操作的速度;
函數(shù)索引既可以使用B樹索引,也可以使用位圖索引。
二、管理索引的原則
使用索引應(yīng)該遵循以下一些基本的原則。
1.小表不需要建立索引。
2.對(duì)于大表而言,如果經(jīng)常查詢的記錄數(shù)目少于表中總記錄數(shù)目的15%時(shí),可以創(chuàng)建索引。這個(gè)比例并不絕對(duì),它與全表掃描速度成反比。
3.對(duì)于大部分列值不重復(fù)的列可建立索引。
4.對(duì)于基數(shù)大的列,適合建立B樹索引,而對(duì)于基數(shù)小的列適合建立位圖索引。
5.對(duì)于列中有許多空值,但經(jīng)常查詢所有的非空值記錄的列,應(yīng)該建立索引。
6.LONG和LONG RAW列不能創(chuàng)建索引。
7.經(jīng)常進(jìn)行連接查詢的列上應(yīng)該創(chuàng)建索引。
8.在使用CREATE INDEX語句創(chuàng)建查詢時(shí),將最常查詢的列放在其他列前面。
9.維護(hù)索引需要開銷,特別時(shí)對(duì)表進(jìn)行插入和刪除操作時(shí),因此要限制表中索引的數(shù)量。對(duì)于主要用于讀的表,則索引多就有好處,但是,一個(gè)表如果經(jīng)常被更改,則索引應(yīng)少點(diǎn)。
10.在表中插入數(shù)據(jù)后創(chuàng)建索引。如果在裝載數(shù)據(jù)之前創(chuàng)建了索引,那么當(dāng)插入每行時(shí),Oracle都必須更改每個(gè)索引。
三、LONG類型(可存儲(chǔ)2G)主要用于不需要作字符串搜索的長(zhǎng)串?dāng)?shù)據(jù),如果要進(jìn)行字符搜索就要用varchar2類型,存儲(chǔ)這么長(zhǎng)的請(qǐng)使用 pstat1.setCharacterStream()方法,資料見附件P26
四、創(chuàng)建索引語法如下
CREATE INDEX語句的語法如下:
CREATE [UNIQUE] | [BITMAP] INDEX index_name
ON table_name([column1 [ASC|DESC],column2
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]
[STORAGE (INITIAL n2)]
[NOLOGGING]
[NOLINE]
[NOSORT];
五、
1、查看索引信息可以在 all_indexs 表中
2、查看索引信息及引用的列 all_ind_columns
3、查看函數(shù)索引信息 all_ind_expressions
4、oracle比較智能,有時(shí)候即使創(chuàng)建了索引也不會(huì)使用,比如說在數(shù)據(jù)量比較少的情況下,可能就不會(huì)用索引
5、當(dāng)進(jìn)行全表掃描的時(shí)候,不用索引效率會(huì)更好
6、查詢可能會(huì)使用緩存,所以說如果發(fā)現(xiàn)執(zhí)行速度變快了,不一定說明你的sql更優(yōu)了,有可能是使用到了緩存而已
7、使用plsql中的“解釋計(jì)劃”功能可以比較執(zhí)行計(jì)劃的消耗,進(jìn)而寫出更優(yōu)的sql
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)中基本的查詢優(yōu)化與子查詢優(yōu)化講解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中基本的查詢優(yōu)化與子查詢優(yōu)化講解,舉了實(shí)例來分析子查詢對(duì)性能的影響,需要的朋友可以參考下2016-01-01詳解Oracle如何將txt文件中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)
這篇文章主要介紹了Oracle如何將txt文件中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03Oracle 數(shù)據(jù)庫(kù)特殊查詢總結(jié)
這篇文章主要介紹了Oracle 數(shù)據(jù)庫(kù)特殊查詢總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08在oracle 數(shù)據(jù)庫(kù)查詢的select 查詢字段中關(guān)聯(lián)其他表的方法
在實(shí)際開發(fā)過程中,特別是在做數(shù)據(jù)查詢的時(shí)候,能夠根據(jù)動(dòng)態(tài)生成的sql語句將查詢的結(jié)果轉(zhuǎn)化并返回到業(yè)務(wù)處理邏輯(或頁面展示出來)能大大的減輕業(yè)務(wù)邏輯的處理復(fù)雜度。2009-08-08Oracle數(shù)據(jù)庫(kù)的實(shí)例/表空間/用戶/表之間關(guān)系簡(jiǎn)單講解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)的實(shí)例/表空間/用戶/表之間關(guān)系簡(jiǎn)單講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08關(guān)于ORA-04091異常的出現(xiàn)原因分析及解決方案
這篇文章主要介紹了關(guān)于ORA-04091異常的出現(xiàn)原因分析及解決方案,本文給大家分享異常出現(xiàn)的場(chǎng)景及解決代碼,感興趣的朋友跟隨小編一起看看吧2023-05-05