當前位置:首頁 » 數據倉庫 » 資料庫點陣圖索引
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫點陣圖索引

發布時間: 2022-05-02 22:48:59

① oracle資料庫索引種類,分別什麼情況下使用

1. b-tree索引
Oracle資料庫中最常見的索引類型是b-tree索引,也就是B-樹索引,以其同名的計算科學結構命名。CREATE
INDEX語句時,默認就是在創建b-tree索引。沒有特別規定可用於任何情況。
2. 點陣圖索引(bitmap index)
點陣圖索引特定於該列只有幾個枚舉值的情況,比如性別欄位,標示欄位比如只有0和1的情況。
3. 基於函數的索引
比如經常對某個欄位做查詢的時候是帶函數操作的,那麼此時建一個函數索引就有價值了。
4. 分區索引和全局索引
這2個是用於分區表的時候。前者是分區內索引,後者是全表索引
5. 反向索引(REVERSE)
這個索引不常見,但是特定情況特別有效,比如一個varchar(5)位欄位(員工編號)含值
(10001,10002,10033,10005,10016..)
這種情況默認索引分布過於密集,不能利用好伺服器的並行
但是反向之後10001,20001,33001,50001,61001就有了一個很好的分布,能高效的利用好並行運算。
6.HASH索引
HASH索引可能是訪問資料庫中數據的最快方法,但它也有自身的缺點。集群鍵上不同值的數目必須在創建HASH集群之前就要知道。需要在創建HASH集群的時候指定這個值。使用HASH索引必須要使用HASH集群。

② oracle 資料庫如何建立索引 如何用索引

創建索引語法:

CREATE [UNIQUE] | [BITMAP] INDEX index_name

--unique表示唯一索引

ON table_name([column1 [ASC|DESC],column2

--bitmap,創建點陣圖索引

[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]

--指定索引在數據塊中空閑空間

[STORAGE (INITIAL n2)][NOLOGGING]

--表示創建和重建索引時允許對表做DML操作,默認情況下不應該使用

[NOLINE][NOSORT];

--表示創建索引時不進行排序,默認不適用,如果數據已經是按照該索引順序排列的可以使用

(2)資料庫點陣圖索引擴展閱讀:

1、如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引

2、至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句引用時,優化器才會使用該索引)

3、小表不要簡歷索引

4、對於基數大的列適合建立B樹索引,對於基數小的列適合簡歷點陣圖索引

5、列中有很多空值,但經常查詢該列上非空記錄時應該建立索引

6、經常進行連接查詢的列應該創建索引

7、使用create index時要將最常查詢的列放在最前面

8、LONG(可變長字元串數據,最長2G)和LONG RAW(可變長二進制數據,最長2G)列不能創建索引

9、限製表中索引的數量(創建索引耗費時間,並且隨數據量的增大而增大;索引會佔用物理空間;當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度)

③ 請問一下ORACLE的點陣圖索引和B*tree索引的實現原理是怎樣的

1、語法
create bitmap index index_name on 表名(欄位);
2、舉個例子你就能明白了:
如有表 test(id,name,address)
數據
(1,張三,大連)
(2,李四,天津)
(3,王五,北京)
(4,趙六,大連)
....

類似這樣的數據,如果查詢的時候用到 ,因為資料庫中有很多這樣的數據,所以一般的索引起不到查詢加速的作用,而建立點陣圖索引後會產生如下點陣圖效果:
假設有4條數據(就如上所示)

大連 天津 北京
1 0 0
0 1 0
0 0 1
1 0 0

這樣當查詢:
select * from 表 where address='大連' or address='北京';
的時候資料庫很快就能根據 同行的 1和0 判斷出那一條數據符合要求。

---
以上,希望對你有所幫助。

④ Oracle資料庫中的最常用的索引有哪些

1. b-tree索引
Oracle資料庫中最常見的索引類型是b-tree索引,也就是B-樹索引,以其同名的計算科學結構命名。CREATE
INDEX語句時,默認就是在創建b-tree索引。沒有特別規定可用於任何情況。
2. 點陣圖索引(bitmap index)
點陣圖索引特定於該列只有幾個枚舉值的情況,比如性別欄位,標示欄位比如只有0和1的情況。
3. 基於函數的索引
比如經常對某個欄位做查詢的時候是帶函數操作的,那麼此時建一個函數索引就有價值了。

⑤ 資料庫索引有哪幾種怎樣建立索引

  • 種類:

1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引;

  • 非唯一索引:

create index 索引名 on 表名(列名) tablespace表空間名;

  • 唯一索引:

建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引;

2、索引列的個數:單列索引和復合索引;

3、按照索引列的物理組織方式。

  • 索引的創建格式:

CREATEUNIUQE|BITMAPINDEX<schema>.<index_name>ON<schema>.<table_name>(<column_name>|<expression>ASC|DESC,<column_name>|<expression>ASC|DESC,...)TABLESPACE<tablespace_name>STORAGE<storage_settings>LOGGING||COMPRESS<nn>NOSORT|REVERSEPARTITION|GLOBALPARTITION<partition_setting>

使用USER_IND_COLUMNS查詢某個TABLE中的相應欄位索引建立情況

使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。

在Oracle中的索引可以分為:B樹索引、點陣圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:

一、B樹索引:

最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:

可以保證無論用戶要搜索哪個分支的葉子結點,都需要經過相同的索引層次,即都需要相同的I/O次數。

B樹索引的創建示例:

create index ind_t on t1(id);

注1:索引的針對欄位創建的,相同欄位不能創建一個以上的索引;

注2:默認的索引是不唯一的,但是也可以加上unique,表示該索引的欄位上沒有重復值(定義unique約束時會自動創建);

注3:創建主鍵時,默認在主鍵上創建了B樹索引,因此不能再在主鍵上創建索引。

二、點陣圖索引:

有些欄位中使用B樹索引的效率仍然不高,例如性別的欄位中,只有「男、女」兩個值,則即便使用了B樹索引,在進行檢索時也將返回接近一半的記錄。

所以當欄位的基數很低時,需要使用點陣圖索引。(「低」的標準是取值數量 < 行數*1%)

反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的位元組,然後對反向後的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。

反向鍵索引的創建示例:

createindex ind_t on t1(id) reverse;

註:鍵的反轉由系統自行完成。對於用戶是透明的。

四、基於函數的索引:

有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';

但是即便在date欄位上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:

create index ind_t on t1(to_char(date,'yyyy'));

註:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。

五、全局索引和局部索引:

這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎麼分區,都是為了方便管理。

具體索引和表的關系有三種:

1、局部分區索引:分區索引和分區表1對1

2、全局分區索引:分區索引和分區表N對N

3、全局非分區索引:非分區索引和分區表1對N

創建示例:

首先創建一個分區表

createtable student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

創建局部分區索引(1v1):

create index ind_t on student(stuno)

local(

partition part_01 tablespace A2,

partition part_02 tablespace A1

);--local後面可以不加

創建全局分區索引(NvN):

create index ind_t on student(stuno)

globalpartition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

);--只可以進行range分區

創建全局非分區索引(1vN)

createindex ind_t on student(stuno) GLOBAL;

⑥ 請問在為新項目製作資料庫時可以做幾種索引索引可以有幾種類型

Oracle
索引種類:

1、B*樹索引
默認的「傳統」索引
1.1、索引組織表
1.2、B*樹聚簇索引
1.3、降序索引
1.4、反向鍵索引
當 通過索引訪問表中很少的一部分數據 或者 處理表中的多行,可以只用索引而不用表 的情況下,可以創建 B*樹索引

2、點陣圖索引
對於 相異基數 低的數據,採用點陣圖索引較為合適

3、點陣圖聯結索引

4、基於函數的索引

5、應用域索引

SQL Server
索引種類:
1、聚集索引
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。

聚集索引對於那些經常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程序執行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的性能。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本。

2、非聚集索引
非聚集索引與課本中的索引類似。數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。如果在表中未創建聚集索引,則無法保證這些行具有任何特定的順序。

聚集是物理排序。而非聚集是不用將表和視圖進行物理排序。
每個表或視圖中最多有250個非聚集排序,或有249個非聚集排序和一個聚集排序。

⑦ Oralce資料庫中如何選擇合適的索引類型

憑借字典的目錄,我們可以非常迅速的找到我們所需要的條目。資料庫也是如此。憑借Oracle資料庫的索引,相關語句可以迅速的定位記錄的位置,而不必去定位整個表。 雖然說,在表中是否創建索引,不會影響到Oracle資料庫的使用,也不會影響資料庫語句的使用。這就好像即使字典沒有目錄的話,用戶仍然可以使用它一樣。可是,若字典沒有目錄,那麼可想而知,用戶要查某個條目的話,其不得不翻遍整本字典。資料庫也是如此。若沒有建立相關索引的話,則資料庫在查詢記錄的時候,不得不去查詢整個表。當表中的記錄比較多的時候,其查詢效率就會很低。所以,合適的索引,是提高資料庫運行效率的一個很好的工具。 不過,並不是說表上的索引越多越好。過之而不及。故在資料庫設計過程中,還是需要為表選擇一些合適的索引。寧缺勿爛,這是建立索引時的一個具體選擇。在理論上,雖然一個表可以設置無限的索引。但是,資料庫管理員需要知道,表中的索引越多,維護索引所需要的開銷也就越大。每當數據表中記錄有增加、刪除、更新變化的時候,資料庫系統都需要對所有索引進行更新。故資料庫表中的索引絕對不是多多益善。具體來說,在索引建立上,筆者對大家有如下建議。 建議一:在基數小的欄位上要善於使用點陣圖索引。 基數是點陣圖索引中的一個基本的定義,它是指資料庫表中某個欄位內容中不重復的數值。如在員工信息表中的性別欄位,一般就只有男跟女兩個值,所以,其基數為2;婚姻狀況欄位的話,則其只有已婚、未婚、離婚三種狀態,其基數就為3;民族一覽內也是只有有限的幾個值。 對於要查詢基數小的欄位,如現在用戶想查找所有婚姻狀況為「已婚」的「女性」時,利用點陣圖索引可以提高查詢的效率。這主要是因為標准索引是通過在索引中保存排序過的索引列以及對應的ROWID來實現的。若我們在基數小的列上建立標准索引的話,則其會返回大量的記錄。 而當我們在創建點陣圖索引的時候,在Oracle會對整個表進行掃描,並且會為索引列的每個取值建立一個點陣圖。若內容相同,則在點陣圖上會以一個相同的數字表示。此時,若這個欄位的基數比較小的話,則若需要實現對整個欄位的查詢的話,效率就會非常的高。因為此時,資料庫只要點陣圖中數字相同的內容找出來即可。 除了在數據表某列基數比較小的情況下,採用點陣圖索引外,我們往往在一些特殊的情況下,也會建議採用點陣圖索引。最常見的情況是,在Where限制條件中,若我們多次採用AND或者OR條件時,也建議採用點陣圖索引。因為當一個查詢飲用了一些部署了點陣圖索引的列的時候,這些點陣圖可以很方便的與AND或者Or 運算符操作結合以快速的找出用戶所需要的記錄。 但是,這里要注意,不是在條件語句中包含運算符的時候,採用點陣圖索引都能夠提供比較高的效率。一般來說,只有AND 或者OR運算符的時候,點陣圖索引才會比較具有優勢。若此時用戶採用大於號或者不等於號作為條件語句中的限制條件的時候,則往往採用標准索引具有更大的優勢。 所以,筆者在資料庫設置中,一般只有在三種情況下才採用點陣圖索引。一是列的基數比較小,而有可能需要根據這些欄位的內容查找相關的記錄;二是在條件語句中,用到了AND或者OR運算符的時候。除了這兩種情況外,最好能夠採用其他適合的索引。第三種情況是,需要用到NULL作為查詢的限制條件。因為標准查詢一般情況下,會忽略所有的NULL值列。也就是說,若需要查詢「所有沒有身份證號碼」的員工的信息的時候,標准索引並不能夠起到加速查詢速度的作用。此時,就需要採用點陣圖索引。因為點陣圖索引會記錄相關的NULL值列信息。 建議二:創建索引的一些限制條件。 並不說,表或者列建立的索引越多越好。相反,索引建的越多,有時會反而會影響資料庫運行的整體性能。所以,在建立索引的時候,仍然會有一些限制條件。 一是不要對一些記錄內容比較少的表建立索引。在一個應用系統設計的時候,如設計一個ERP系統的資料庫,其雖然有幾千張表。但是,並不是每張表都有大量記錄的。相反,其中有近一半左右的數據表,可能其存儲的數據不會超過百條。如員工登陸帳戶密碼表、企業部門信息表等等。對於這些記錄內容比較少的表,我們建立最好不要為其建立索引。無論是表上的,還是欄位上,都不要建立索引。 二是若表中的內容比較大,但是,這個表基本上不怎麼查詢的時候,則只需要在表上建立索引即可;而不需要在欄位上建立索引。如現在在ERP系統中,有一張表是「AD_Table」。其存儲的是這個資料庫中相關表的信息。這張表只有在資料庫設計的時候才會用到。故這張表中的記錄雖然比較多,但是由於用戶用的比較少,所以,一般沒有必要為這張表建立列級別上的索引。而直接用表索引來代替。

⑧ Oracle資料庫中如何選擇合適的索引類型

憑借字典的目錄,我們可以非常迅速的找到我們所需要的條目。資料庫也是如此。憑借Oracle資料庫的索引,相關語句可以迅速的定位記錄的位置,而不必去定位整個表。 雖然說,在表中是否創建索引,不會影響到Oracle資料庫的使用,也不會影響資料庫語句的使用。這就好像即使字典沒有目錄的話,用戶仍然可以使用它一樣。可是,若字典沒有目錄,那麼可想而知,用戶要查某個條目的話,其不得不翻遍整本字典。資料庫也是如此。若沒有建立相關索引的話,則資料庫在查詢記錄的時候,不得不去查詢整個表。當表中的記錄比較多的時候,其查詢效率就會很低。所以,合適的索引,是提高資料庫運行效率的一個很好的工具。 不過,並不是說表上的索引越多越好。過之而不及。故在資料庫設計過程中,還是需要為表選擇一些合適的索引。寧缺勿濫,這是建立索引時的一個遵循標准。在理論上,雖然一個表可以設置無限的索引。但是,資料庫管理員需要知道,表中的索引越多,維護索引所需要的開銷也就越大。每當數據表中記錄有增加、刪除、更新變化的時候,資料庫系統都需要對所有索引進行更新。故資料庫表中的索引絕對不是多多益善。具體來說,在索引建立上,筆者對大家有如下建議。 建議一:在基數小的欄位上要善於使用點陣圖索引。 基數是點陣圖索引中的一個基本的定義,它是指資料庫表中某個欄位內容中不重復的數值。如在員工信息表中的性別欄位,一般就只有男跟女兩個值,所以,其基數為2;婚姻狀況欄位的話,則其只有已婚、未婚、離婚三種狀態,其基數就為3;民族一覽內也是只有有限的幾個值。 對於要查詢基數小的欄位,如現在用戶想查找所有婚姻狀況為「已婚」的「女性」時,利用點陣圖索引可以提高查詢的效率。這主要是因為標准索引是通過在索引中保存排序過的索引列以及對應的ROWID來實現的。若我們在基數小的列上建立標准索引的話,則其會返回大量的記錄。 而當我們在創建點陣圖索引的時候,在Oracle會對整個表進行掃描,並且會為索引列的每個取值建立一個點陣圖。若內容相同,則在點陣圖上會以一個相同的數字表示。此時,若這個欄位的基數比較小的話,則若需要實現對整個欄位的查詢的話,效率就會非常的高。因為此時,資料庫只要點陣圖中數字相同的內容找出來即可。 除了在數據表某列基數比較小的情況下,採用點陣圖索引外,我們往往在一些特殊的情況下,也會建議採用點陣圖索引。最常見的情況是,在Where限制條件中,若我們多次採用AND或者OR條件時,也建議採用點陣圖索引。因為當一個查詢飲用了一些部署了點陣圖索引的列的時候,這些點陣圖可以很方便的與AND或者Or 運算符操作結合以快速的找出用戶所需要的記錄。 但是,這里要注意,不是在條件語句中包含運算符的時候,採用點陣圖索引都能夠提供比較高的效率。一般來說,只有AND 或者OR運算符的時候,點陣圖索引才會比較具有優勢。若此時用戶採用大於號或者不等於號作為條件語句中的限制條件的時候,則往往採用標准索引具有更大的優勢。 所以,筆者在資料庫設置中,一般只有在三種情況下才採用點陣圖索引。一是列的基數比較小,而有可能需要根據這些欄位的內容查找相關的記錄;二是在條件語句中,用到了AND或者OR運算符的時候。除了這兩種情況外,最好能夠採用其他適合的索引。第三種情況是,需要用到NULL作為查詢的限制條件。因為標准查詢一般情況下,會忽略所有的NULL值列。也就是說,若需要查詢「所有沒有身份證號碼」的員工的信息的時候,標准索引並不能夠起到加速查詢速度的作用。此時,就需要採用點陣圖索引。因為點陣圖索引會記錄相關的NULL值列信息。 建議二:創建索引的一些限制條件。 並不說,表或者列建立的索引越多越好。相反,索引建的越多,有時會反而會影響資料庫運行的整體性能。所以,在建立索引的時候,仍然會有一些限制條件。 一是不要對一些記錄內容比較少的表建立索引。在一個應用系統設計的時候,如設計一個ERP系統的資料庫,其雖然有幾千張表。但是,並不是每張表都有大量記錄的。相反,其中有近一半左右的數據表,可能其存儲的數據不會超過百條。如員工登陸帳戶密碼表、企業部門信息表等等。對於這些記錄內容比較少的表,我們建立最好不要為其建立索引。無論是表上的,還是欄位上,都不要建立索引。 二是若表中的內容比較大,但是,這個表基本上不怎麼查詢的時候,則只需要在表上建立索引即可;而不需要在欄位上建立索引。如現在在ERP系統中,有一張表是「AD_Table」。其存儲的是這個資料庫中相關表的信息。這張表只有在資料庫設計的時候才會用到。故這張表中的記錄雖然比較多,但是由於用戶用的比較少,所以,一般沒有必要為這張表建立列級別上的索引。而直接用表索引來代替。 三是在一些NULL欄位上,要根據實際情況來判斷是否要建立索引。如現在有一張人事檔案的表格,其上面有兩個欄位,分別為「身份證號碼」與「地區」。有時會為了某個原因,企業需要所有員工都在系統中登記他們的身份證號碼,以方便他們辦工資卡、社會保險等等。所以人事管理可能需要經常的查詢系統,看看有沒有沒有身份證號碼的員工信息。此時,就需要利用條件「IS NULL」來查詢我們所需要的記錄。故為了提高查詢效率,若某個記錄可能為空,並且經常需要以NULL為條件進行查詢的時候,則最好給這個欄位添加一個索引,並且最好建立點陣圖索引。相反,若雖然可能會以NULL這個條件作為查詢的限制語句,但是,用的不是很多的時候,則就沒有必要為其建立索引。 建議三:多表連接查詢的索引設計。 如現在有一個人事管理系統。人事經理想知道員工的社保繳納情況。他需要知道員工的姓名、職務、戶籍性質(農民戶口跟居民戶口費用不一樣)、繳納的情況等等。但是,這些信息包含在不同的表中。因為為了提高資料庫的性能,在表中存儲的可能只是某些序號,而不是具體的內容。如在社保表中,存儲的是員工對應的編號,而不是員工的名字。所以,要得到這份報表的話,就可能需要關聯員工基本信息表、公司組織結構表等表格,才能夠查詢到用戶所需要的內容。 為此,就需要利用Join語句,把這些表格關聯起來。為了提高資料庫的查詢效率,這些用來關聯的欄位,最好能夠建立索引。這可以顯著的提高查詢的速度。 建議四:在表的更新速度與查詢速度之間尋求一個平衡點。 眾所周知,索引本身並不影響資料庫的使用,其主要是為了提高資料庫的查詢效率。但是,由於當資料庫的表中的數據更新的時候,包括記錄的增加、刪除、更改等等,都會對雖有的索引進行更新。 很明顯,索引雖然可以提高查詢速度。但是,也會對一些表的更新操作產生不良的影響。當在表中建立的索引越多,這個不利影響也會越大。故資料庫管理員在設置索引的時候,還需要注意,在這兩個之間需要一個均衡點。 按照一般的理論來說,當某個表多數用來查詢、更新相對來說比較上的話,則要多多採用索引。相反,當某個表記錄更新居主導,查詢相對來說比較少的話,則不要建立太多的索引,避免對更新的速度差生不利影響。

⑨ 資料庫索引有哪幾種,怎樣建立索引

資料庫索引的種類:

1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引

非唯一索引:B樹索引

create index 索引名 on 表名(列名) tablespace 表空間名;

唯一索引:建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引

2、索引列的個數:單列索引和復合索引

3、按照索引列的物理組織方式

B樹索引

create index 索引名 on 表名(列名) tablespace 表空間名;

點陣圖索引

create bitmap index 索引名 on 表名(列名) tablespace 表空間名;

反向鍵索引

create index 索引名 on 表名(列名) reverse tablespace 表空間名;

函數索引

create index 索引名 on 表名(函數名(列名)) tablespace 表空間名;

刪除索引

drop index 索引名

重建索引

alter index 索引名 rebuild


索引的創建格式:

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>
ON <schema>.<table_name>
(<column_name> | <expression> ASC | DESC,
<column_name> | <expression> ASC | DESC,...)
TABLESPACE <tablespace_name>
STORAGE <storage_settings>
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS<nn>
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION<partition_setting>

UNIQUE | BITMAP:指定UNIQUE為唯一值索引,BITMAP為點陣圖索引,省略為B-Tree索引。
<column_name> | <expression> ASC | DESC:可以對多列進行聯合索引,當為expression時即「基於函數的索引」
TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
STORAGE:可進一步設置表空間的存儲參數
LOGGING | NOLOGGING:是否對索引產生重做日誌(對大表盡量使用NOLOGGING來減少佔用空間並提高效率)
COMPUTE STATISTICS:創建新索引時收集統計信息
NOCOMPRESS | COMPRESS<nn>:是否使用「鍵壓縮」(使用鍵壓縮可以刪除一個鍵列中出現的重復值)
NOSORT | REVERSE:NOSORT表示與表中相同的順序創建索引,REVERSE表示相反順序存儲索引值
PARTITION | NOPARTITION:可以在分區表和未分區表上對創建的索引進行分區

使用USER_IND_COLUMNS查詢某個TABLE中的相應欄位索引建立情況

使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。

在Oracle中的索引可以分為:B樹索引、點陣圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:

一、B樹索引:

最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:

反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的位元組,然後對反向後的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。

反向鍵索引的創建示例:

createindex ind_t on t1(id) reverse;

註:鍵的反轉由系統自行完成。對於用戶是透明的。

四、基於函數的索引:

有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';

但是即便在date欄位上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:

create index ind_t on t1(to_char(date,'yyyy'));

註:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。

五、全局索引和局部索引:

這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎麼分區,都是為了方便管理。

具體索引和表的關系有三種:

1、局部分區索引:分區索引和分區表1對1

2、全局分區索引:分區索引和分區表N對N

3、全局非分區索引:非分區索引和分區表1對N

創建示例:

首先創建一個分區表

createtable student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

創建局部分區索引(1v1):

create index ind_t on student(stuno)

local(

partition part_01 tablespace A2,

partition part_02 tablespace A1

);--local後面可以不加

創建全局分區索引(NvN):

create index ind_t on student(stuno)

globalpartition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

);--只可以進行range分區

創建全局非分區索引(1vN)

createindex ind_t on student(stuno) GLOBAL;