SQL查詢--索引

索引概念和做用

索引是創建在表上的可選對象,目的是爲了提升查詢速度。
若是要在表中查詢指定的記錄,在沒有索引的狀況下,必須遍歷整個表,而有了索引以後,只須要在索引中找到符合查詢條件的索引字段值,就能夠經過保存在索引中的ROWID快速找到表中對應的記錄。
例如,若是將表看作一本書,索引的做用相似於書中的目錄。在沒有目錄的狀況下,要在書中查找指定的內容必須閱讀全文,而有了目錄以後,只須要經過目錄就能夠快速找到包含所需內容的頁碼(至關於ROWID)
 
索引的關鍵在於經過一組排序後的索引鍵來取代默認的全表掃描檢索方式,從而提升檢索效率。
索引在邏輯上和物理上都與相關的表的數據無關,當建立或刪除一個索引時,不會影響基本的表、數據庫應用或其餘索引,當插入、更改和刪除相關的表記錄時,Oracle會自動管理所引,若是刪除索引,全部的應用仍然能夠繼續工做。所以在表上一列或多列建立索引不會對錶的使用產生任何影響,可是,能夠提升檢索速度。
 
索引一旦創建後,當在表上進行DML操做時,Oracle會自動維護索引,並決定什麼時候使用索引。
索引的使用對用戶是透明的,用戶不須要再執行SQL語句時指定使用哪一個索引以及如何使用索引。索引只與系統性能相關。

索引原理

 

索引的類型

能夠按照列的多少、索引值是否惟1、索引數據的組織形式對索引進行分類,以知足各類表和查詢條件的要求:
一、單列索引和複合索引
一個索引能夠由一個或多個列組成,基於單個列所建立的索引稱爲單列索引,基於兩列或多列所建立的索引稱爲多列索引。
 
二、B樹索引
B樹索引是Oracle中最經常使用的一種索引。當用 create index 語句建立索引時,默認建立的索引就是B樹索引。
B樹索引是按照B樹結構或使用B樹算法組織並存儲索引數據的,B樹索引就是一棵二叉樹,它由根、分支節點和葉子節點三部分構成。其中,根包含指向分支節點的信息,分支節點包含指向下級分支節點和指向葉子節點的信息,葉子節點包含索引列和指向表中每一個匹配行的ROWID值。葉子節點是一個雙向鏈表,所以能夠對其進行任何方面的範圍掃描。

 

 

 
三、位圖索引
在B樹索引中,保存的是通過排序的索引即其對應的ROWID值,可是對於一些基數很小的列來講,這樣作並不能顯著提升查詢的速度。所謂基數,是指某個列可能擁有的不重複值得個數。好比性別列的基數爲2(只有男和女)
所以,對於像性別、婚姻情況、政治面貌等只有幾個固定值的字段而言,若是要創建索引,應該創建位圖索引,而不是默認的B樹索引。

 

 

 

四、函數索引
Oracle還能夠對包含有列的函數或表達式建立索引,這就是函數索引。
當須要常常訪問一些函數或表達式時,能夠將其存儲在索引中,當下次訪問時,因爲該值已經計算出來了,所以,能夠大大提升那些在 where 字句中包含該函數或表達式的查詢操做的速度。

 

 

管理索引的原則

建立索引

建立索引使用create index語句

 

 

 能夠在一個表上建立多個索引,但這些索引的列的組合必須不一樣,以下:算法

create index idx1 on sales(id,topic); create index idx2 on sales(topic,id);
其中,idx1和idx2索引都使用了id和topic列,但因爲順序不一樣,所以是合法的。
 
建立B樹索引
B樹索引是Oracle默認的索引類型,例如在 sales 表的 topic 列上按標題查詢,能夠在 topic 列上創建B樹索引
create index idx_name on sales(topic); 單列索引
CREATE INDEX idx_name ON sales(job,sal); 複合索引
 
 
建立位圖索引
以sales表的islook列(基數爲2,只有2個值,Y或N)建立位圖索引
create bitmap index idx_name on sales(islook);
(其實建立了索引並不必定就會使用,Oracle在自動蒐集了表和索引的統計信息後,會決定是否使用索引,若是表數據太少,就能夠直接全表掃描,沒必要使用索引)
 
建立函數索引
CREATE INDEX idx_name ON sales(UPPER(topic));
 
重命名索引
alter index idx_name1 rename to idx_name2;

 

刪除索引
drop index idx_name;

 

重建索引
alter index idx_name rebuild;
合併索引
alter index idx_name coalesce;

 

 
查詢索引
用user_indexes和user_ind_columns系統表查看已經存在的索引
user_indexes: 系統視圖存放是索引的名稱以及該索引是不是惟一索引等信息。
user_ind_column: 系統視圖存放的是索引名稱,對應的表和列等。
基本查詢:
select * from user_indexes; select * from user_ind_columns; 關聯查詢: select i.index_name, i.index_type, i.table_owner, i.table_name, i.uniqueness, i.tablespace_name, c.column_name, c.column_position, c.column_length from user_indexes i, user_ind_columns c where i.index_name = c.index_name; 也能夠用all_indexes表查詢 select index_name,index_type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
相關文章
相關標籤/搜索