2012-03-06 122 views
0

對於Oracle來說,我是一個非常新的探索事物,閱讀索引訪問的方式,我得出一個結論,假設我有一個表emp。索引訪問的概念

table emp 
--------------------------- 
empno ename salary mgrid 
--------------------------- 
1 ab 200 2 
2 bn 900 3 
3 bh 900 1 
4 ah 890 4 
5 kk 67 0 
6 ac 9090  

這該是多麼的主鍵EMPNO唯一索引創建

index table(suppose) 
-------------------- 
rowid index value 
--------------------- 
xyzz  1 
-   2 
-   3 
-   4 
-   5 
-   6 

其中 ' - ' 號填列一些十六進制值,假設我寫一個查詢,

select * from emp where empno ='5' 

那麼它將取出的rowid對應的索引值5和讀取該行對應於5 EMPNO從表emp

現在我的疑問是,在這裏它是從index_table取,但要找到的rowid是也掃描整個表(index_table)到5,同樣使用rowid來查找行,那麼它與沒有索引的表有什麼不同呢?還有,我們正在掃描整個表直到5個empno。

唯一的好處是索引是按升序存儲的。

我知道我錯了,但有人可以解釋這個

**Doubt** 

執行全表掃描,掃描每行柱不論它過濾條件? 讓我們接受上面使用的查詢,如果該表emp上沒有主鍵,那麼它將執行全表掃描,然後對於empno = 5,它會掃描每一行empno值還是會掃描empname,薪水和mrgid也?

回答

3

Oracle(或任何其他數據庫)是而不是在您發佈的示例中掃描整個索引。這就是堆表和索引之間的區別。

非常廣義而言,您可以將索引與電話簿進行比較。如果你想找到的電話號碼在(在的rowid弗蘭克·米勒的喬治敦(EMPNO = 5)你把電話本,找到條目喬治敦。您不必閱讀整個電話簿,因爲您知道城鎮已經訂購。所以你打開中間的電話簿,發現小鎮是蒙大拿市。由於蒙大拿州城在喬治城之後,您在當前開放和開始之間打開電話簿。採用這種策略,直到找到喬治城。然後你用姓氏和名字做同樣的事情。

同樣,這是有效的,因爲城鎮,姓氏和名字按字母順序排列。在數據庫中,這是通過b-trees確保的。

你可能想獲得更多資料,B樹讀了,例如 on tahiti

編輯:你還問,如果數據庫必須掃描整個表,如果沒有主鍵。答案是:是的,它必須,如果也沒有empno上的索引。

在電話簿中比喻,這將是一個像這樣的查詢查找所有電話號碼的地址是22 Elm Street。由於電話簿不是按街道名稱或門牌號碼排序的,您必須閱讀每個條目才能找到相應的電話號碼。

+0

謝謝雷內的精彩解釋,但你能否清除上面提到的問題中提到的另外一個疑問,我最近更新了 – 2012-03-06 16:56:05

0

對於索引表,不僅可以在主鍵上使用它。對於其他任何列,數據可能不會很好地排序,比如您提供的示例中的「薪水」。

在這種情況下,使用索引表會很有用,特別是當您有數千個條目時。

+0

有一個問題,全表掃描,掃描具有特定列值的行,或者它將掃描整行的列值,而不管我們使用的是什麼過濾器,假設我已經寫了一個查詢select * from emp where empno = 3,here它會掃描一個特定的行,只有empno或所有列像ename,salary,mgrid? – 2012-03-06 16:45:54

+0

:我只想知道我的概念有什麼問題? – 2012-03-06 16:48:44

+0

我不是100%確定的,但我會假設會參考您正在過濾的值的索引表。 – jsimpson 2012-03-06 16:51:53