日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

8、oracle数据库下的索引

發布時間:2023/12/3 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8、oracle数据库下的索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ORACLE下的索引

索引是oracle下的一類對象,主要用于提高查詢的效率。

1.操作索引

1.1 創建、修改索引

-- 添加一般索引

create index i_test_tname on test(tname);
-- 添加唯一索引,不能包含相同的值
create unique index i_test_tname on test(tname);

-- 修改索引

ALTER INDEX 索引名 RENAME TO 新名

1.2 查看索引

-- 查看全部索引
select * from user_indexes

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))
引用
select custom_id,first_name from customer

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数据库下的索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。