8、oracle数据库下的索引
ORACLE下的索引
索引是oracle下的一類對象,主要用于提高查詢的效率。
1.操作索引
1.1 創建、修改索引
| -- 添加一般索引 create index i_test_tname on test(tname); -- 修改索引 ALTER INDEX 索引名 RENAME TO 新名 |
1.2 查看索引
| -- 查看全部索引 |
1.3 刪除索引
| DROP INDEX 索引名 |
2.索引分類
2.1位圖索引
適合應用在表中含有大量數據,而且不經常修改的表中,語法是
| create bitmap index 索引名 on 表名(列名) |
2.2 B樹索引
默認的索引類型,平衡樹索引
2.3唯一索引
適用于包含低級數列以及在sql語句的where子句中使用許多and或者or運算符的數據庫環境。
2.4函數索引
適用于使用了sql函數的列
| -- 添加索引 create index i_test_tname on test(upper(tids)) where upper(first_name) = upper('BROWN'); |
3.索引優缺點
使用索引提高了查詢的效率,不過也會有一些缺點。通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性;可以大大加快數據的檢索速度,這也是創建索引的最主要的原因;另外可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義;在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間;通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
不過使用索引也會有一些缺點。創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加;索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大;當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
因此創建索引時需要判斷,哪些列建索引的好處大于弊端。一般在經常需要搜索、連接的列上加索引;在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;在經常使用WHERE子句中的列上面創建索引,加快條件的判斷速度。除此之外,對于那些在查詢中很少使用的列不應該創建索引;對于那些只有很少數據值的列也不應該增加索引;對于那些定義為blob數據類型的列不應該增加索引;修改性能遠遠大于檢索性能時,不應該創建索引,這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。
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'; |
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自動限制索引的使用.
總結
以上是生活随笔為你收集整理的8、oracle数据库下的索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是一鲸落万物生 一鲸落万物生是什么意
- 下一篇: 美丽的反义词是什么 美丽的意思