程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle索引簡介

Oracle索引簡介

編輯:Oracle教程

1 索引的創建語法:
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>


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


2 索引特點:
第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。


3 索引不足:
第一,創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。
第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。


4.限制索引
限制索引是一些沒有經驗的開發人員經常犯的錯誤之一。在SQL中有很多陷阱會使一些索引無法使用。下面討論一些常見的問題:


4.1 使用不等於操作符(<>、!=)
下面的查詢即使在cust_rating列有一個索引,查詢語句仍然執行一次全表掃描。
select cust_Id,cust_name from customers where cust_rating <> 'aa';
把上面的語句改成如下的查詢語句,這樣,在采用基於規則的優化器而不是基於代價的優化器(更智能)時,將會使用索引。
select cust_Id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa';
特別注意:通過把不等於操作符改成OR條件,就可以使用索引,以避免全表掃描。


4.2 使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL同樣會限制索引的使用。因為NULL值並沒有被定義。在SQL語句中使用NULL會有很多的麻煩。
因此建議開發人員在建表時,把需要索引的列設成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會使用這個索引
(除非索引是一個位圖索引,關於位圖索引在稍後在詳細討論)。

4.3 使用函數
如果不使用基於函數的索引,那麼在SQL語句的WHERE子句中對存在索引的列使用函數時,會使優化器忽略掉這些索引。
下面的查詢不會使用索引(只要它不是基於函數的索引)
select empno,ename,deptno from emp where trunc(hiredate)='01-MAY-81';
把上面的語句改成下面的語句,這樣就可以通過索引進行查找。
select empno,ename,deptno from emp where hiredate<(to_date('01-MAY-81')+0.9999);


4.4 比較不匹配的數據類型
也是比較難於發現的性能問題之一。 注意下面查詢的例子,account_number是一個VARCHAR2類型,在account_number字段上有索引。
下面的語句將執行全表掃描:
select bank_name,address,city,state,zip from banks where account_number = 990354;
Oracle可以自動把where子句變成to_number(account_number)=990354,這樣就限制了索引的使用,改成下面的查詢就可以使用索引:
select bank_name,address,city,state,zip from banks where account_number ='990354';
特別注意:不匹配的數據類型之間比較會讓Oracle自動限制索引的使用,即便對這個查詢執行Explain Plan也不能讓您明白為什麼做了一次“全表掃描”


5 查詢索引
查詢DBA_INDEXES視圖可得到表中所有索引的列表,注意只能通過USER_INDEXES的方法來檢索模式(schema)的索引。
訪問USER_IND_COLUMNS視圖可得到一個給定表中被索引的特定列。


6 組合索引
當某個索引包含有多個已索引的列時,稱這個索引為組合(concatented)索引


7 索引的類型
B-樹索引、位圖索引、HASH索引、索引編排表 、反轉鍵索引、基於函數的索引、分區索引、本地和全局索引

7.1 B樹索引(默認類型)
B-tree 特點:
適合與大量的增、刪、改(OLTP)
不能用包含OR操作符的查詢;
適合高基數的列(唯一值多)
典型的樹狀結構;
每個結點都是數據塊;
大多都是物理上一層、兩層或三層不定,邏輯上三層;
葉子塊數據是排序的,從左向右遞增;
在分支塊和根塊中放的是索引的范圍;
注:B*Tree索引在檢索高基數數據列(高基數數據列是指該列有很多不同的值)時提供了最好的性能。
當取出的行數占總行數比例較小時B-Tree索引比全表檢索提供了更有效的方法。但當檢查的范圍超過表的10%時就不能提高取回數據的性能。

7.2 位圖索引
Bitmapt 特點:
適合與決策支持系統;
做UPDATE代價非常高;
非常適合OR操作符的查詢;
基數比較少的時候才能建位圖索引;
注:位圖索引最好用於低cardinality列(即列的唯一值除以行數為一個很小的值,接近零),
例如又一個“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬條記錄,那麼3/3000000約等於0,這種情況下最適合用位圖索引


7.3 函數索引
可以在表中創建基於函數的索引。如果沒有基於函數的索引,任何在列上執行了函數的查詢都不能使用這個列的索引。
必須設置以下兩個系統參數:
QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved