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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[转载]oracle索引的简单总结

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载]oracle索引的简单总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址:oracle索引的簡單總結作者:kindle

一、索引的概念:

??? 數據庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫。

二、索引的特點:

??? 1.索引可以加快數據庫的檢索速度
??? 2.索引降低了數據庫插入、修改、刪除等維護任務的速度

三、oracle索引的類型:

b*樹索引:

??? 這是Oracle中最常用的索引,它的構造類似于二叉樹,能根據鍵提供一行或一個行集的快速訪問,通常只需要很少的讀操作就能找到正確的行。B*樹索引由兩列組成,第一列是ROWID, 它是行的位置(它指向了數據庫表中對應的此行的位置);第二列是正被索引列的值(具體的被建立了索引的列的值,我們先是根據?

這個值通過導航塊找到這個葉子節點的該項(值,rowid),然后通過rowid找到具體的這行記錄)。

?

???????????? 圖:典型的B*樹索引布局

??? 這個樹底層的塊稱為葉子節點/葉子塊,其中分別包含各個索引鍵值以及一個rowid(它是指向所索引的行)。葉子節點之上的內部塊稱為分支塊(branch block)/導航塊,這些節點用于實現導航。例如,如果想在索引中找到值20,要從樹頂開始,找到左分支,我們檢查這個塊,并發現需要找到范圍"20..25"的塊,這個塊將是葉子塊,其中會指示包含數20的行。索引的葉子節點實際上構成了一個雙向鏈表。一旦發現要從葉子節點中的哪里開始,執行值的有序掃描就會很容易,我們就不必再在索引結構中導航,而只需根據葉子節點向前或向后掃描就可以了(比如要做between 20 to 40,我們只需要先導航找到20,然后順序掃描直到遇到40即可)。

??? B*樹的特點之一是:所有葉子塊都應該在樹的同一層上,這一層稱之為索引的高度, 它說明所有從索引的根塊到葉子塊的遍歷都會訪問同樣數目的塊。由此可見B*樹的B代表的是balanced,所謂的"Height balanced"。大多數B*樹索引的高度都是2或3,即使索引中有數百萬行記錄也是如此,這說明,一般而言,在索引中找到一個鍵只需要2到3次I/O , 這確實不錯。

??? B*樹是一個極佳的通用索引機制,無論是大表還是小表都很適用,隨著底層表大小增長,獲取數據的性能僅會稍有惡化。

比如,我們為customers表建立一個常見的B*樹索引: 

?? CREATE?INDEX?IDX_Cus_City?on?customers(city)

b*樹子索引---復合索引

??? 復合索引也是一種B*樹索引,它由多列組成。當我們擁有使用兩列或超過兩列的頻繁查詢時,就使用B*樹復合索引,而其所使用的兩列或多列在where子句中and邏輯操作符連接。因為復合索引中列的順序很重要,所以確信以最有效的索引順序排列他們,前導列應該是基數大的列(不同的取值多)。而且單獨的where也會使用此索引,而后序列則必須與前導一起使用。

反向索引:

??? Oracle推出它的主要目的就是為了降低在并行服務器(Oracle Parallel Server)環境下索引葉塊的爭用。當B*Tree索引中列是由遞增的序列號產生的話,那么這些索引信息基本上分布在同一個葉塊,當用戶修改或訪問相似的列時,索引塊很容易產生爭用。反向索引中的索引碼將會被分布到各個索引塊中,減少了爭用。反向索引反轉了索引碼中每列的字節,使得它們不會分到一個葉子塊中,但是反向索引也因此不能應用于范圍搜索,因為它的相鄰葉子塊是無順序的。

??? CREATE?INDEX?index_name?on?table_name(column_name)?REVERSE?;

降序索引:

??? 降序索引是oracle 8i引入的,用以擴展B*樹索引的功能,它允許在索引中以降序(從大到小的順序)存儲一列。對于降序的order by有效。

位圖索引:

??? 當我們需要根據基數比較小的列進行查詢時,一般使用位圖索引會對查詢效率有明顯提高,如查詢性別是女,已婚,漢族的人。(性別,婚否,民族基數都比較小)

??? CREATE BITMAP INDEX index_name ON table_name(column_name1,column_name2) TABLESPACE tablespace_name

函數索引:

??? B*Tree的衍生產物,應用于查詢語句條件列上包含函數的情況,索引中儲存了經過函數計算的索引碼值。可以在不修改應用程序的基礎上能提高查詢效率。

五、建立合適的索引:

1、最簡單的情形:

?? 如果你在查詢時常用類似以下的語句 + 表的記錄比較多 + category_id基數比較大(不重復記錄數)?
???SELECT * FROM mytable WHERE category_id=1;
?? 最直接的應對之道,是為category_id建立一個簡單的索引:
  CREATE INDEX mytable_categoryid ON mytable (category_id);

2、如果你有不止一個選擇條件,例如:
  SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

?? 你可以建立復合索引。

?? CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

3、如果有個ORDER BY子句,那么我們就為這個ORDER BY字段建立一個索引

?? 如果是降序的,我們可以建立降序索引,否則建立普通索引。

4、在基數小的字段上要善于使用位圖索引。

?? 如在員工信息表中的性別字段,一般就只有男跟女兩個值,所以,其基數為2;婚姻狀況字段的話,則其只有已婚、未婚、離婚三種狀態,其基數就為3;民族一覽內也是只有有限的幾個值。

5、需要利用Join語句連接多個表時,把這些表格關聯起來。為了提高數據庫的查詢效率,這些用來關聯的字段,最好能夠建立索引。這可以顯著的提高查詢的速度。

六、索引的屏蔽:

在SQL中有很多陷阱會使一些索引無法使用。下面討論一些常見的問題:
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條件,就可以使用索引,以避免全表掃描。
2、 使用IS NULL 或IS NOT NULL

??? 使用IS NULL 或IS NOT NULL同樣會限制索引的使用。因為NULL值并沒有被定義。在SQL語句中使用NULL會有很多的麻煩。因此建議開發人員在建表時,把需要索引的列設成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會使用這個索引(除非索引是一個位圖索引)。
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、 比較不匹配的數據類型

??? 比較不匹配的數據類型也是比較難于發現的性能問題之一。注意下面查詢的例子,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';

?

轉載于:https://www.cnblogs.com/liuzhuqing/archive/2011/11/22/7480959.html

總結

以上是生活随笔為你收集整理的[转载]oracle索引的简单总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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