oracle:索引

數據庫索引用來在表中查找特定的行。

使用索引的一個負面影響:向表中添加新行時,必須花費額外的時間來更新該行的索引。

一個基本原則:當任何單個查詢要檢索的行少於或等於整個錶行數的10%時,索引就非常有用。

索引的候選列應該是用來存儲很大範圍的值的列。這些索引類型被稱爲“B-樹”索引

好的索引候選列是那些對每個記錄只包含一個唯一數字的列;差的索引候選列是那些只包含很小範圍的數字代碼。

Oracle數據庫會爲表的主鍵以及包含在唯一約束中的列自動創建B-樹索引。對於包含小範圍值的列,可以使用位圖索引。

創建B-樹索引: CREATE INDEX可以用來創建B-樹索引

CREATE [UNIQUE] INDEX index_name ON

table_name ( column_name[,column_name ...])

TABLESPACE tab_space;

由於性能方面的原因,通常應該將索引與表存儲到不同的表空間中。在產品數據庫中,數據庫管理員應該爲表和索引創建不同的表空間。

CREATE UNIQUE INDEX i_customer_phone ON customers(phone);

CREATE INDEX i_employees_first_last_name ON employees(first_name,last_name);

創建基於函數的索引:如果想讓索引可以基於函數的結果使用,就必須創建基於函數的索引。

CREATE INDEX i_func_customers_last_name ON customers(UPPER(last_name));

爲了利用基於函數的索引,DBA必須將初始化參數QUERY_REWRITE_ENABLED設置爲true。ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;

獲取有關索引的信息:從user_indexes(all_indexes)視圖中可以獲得有關索引的信息。

SELECT index_name,table_name,uniqueness,status FROM user_indexes;

獲取列索引的信息:通過user_ind_columns視圖可以獲得列索引的信息。

SELECT index_name,table_name,column_name FROM user_ind_columns;

修改索引

ALTER INDEX可以用來修改索引。

ALTER INDEX i_customers_phone RENAME TO i_customers_phone_number;

刪除索引

DROP INDEX i_customers_phone_number;

創建位圖索引:位圖索引一般用於數據倉庫中,數據倉庫是包含大量數據的數據庫。數據倉庫中的數據一般使用很多查詢來讀取,但數據並不被很多併發事務所修改。

位圖索引的候選列是在很多查詢中被引用但只包含小範圍值的列。

索引一般包含一個指向錶行的指針,錶行包括一個給定的索引鍵值。鍵值用來獲取錶行的rowid(行的物理位置)。在B-樹索引中,對每個鍵存儲一個rowid列表,與具有此鍵值的行相對應。在B-樹索引中,數據庫存儲一個鍵值列表,其中包含每個rowid,這樣數據庫就能夠定位表中實際的行。

在位圖索引中,位圖用於每個鍵值,位圖使數據庫能夠定位一行。位圖中的每一比特位對應於一個可能的rowid。如果比特位被設置,那麼就意味着具有相應rowid的行包含此鍵值。映射函數將比特位置轉換爲實際的rowid。

位圖索引一般用在包含大量數據且內容不常修改的表中。而且位圖索引只應該在包含少量不同值的列上創建。

如果某列的不同值數量少於表中行數的1%,或者如果某列的值的重複次數多於一百次,那麼此列就是位圖索引的候選列。

例:CREATE BITMAP INDEX i_order_status ON order_status(status);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章