Oracle數據庫中的默認索引


 

 

索引

 

SQL性能中最強大和最容易被誤解的地方。在這篇文章中,我們將探討:

 

  • 索引的用途
  • 如何創建和選擇索引類型
  • 討論如何決定索引什么以及如何查看它是否有用。

 

Why?

 

數據庫表可能會變大。驚人地,異常大。掃描數百萬、數十億或數萬億行數據,只返回兩行或三行數據,這是一種巨大的浪費。索引可以幫助你避免這些浪費。

 

索引將值存儲在索引列中。對於每個值,包含它的行的位置。就像一本書后面的索引。這使您能夠專注於您感興趣的數據。

當它們使您能夠找到“一些”行時,它們是最有效的。因此,如果您有一個獲取少量行的查詢,那么您很可能希望它使用索引。你需要做的第一件事就是創建它!
 
 

如何創建索引

 

創建索引很容易。您所需要做的就是確定要索引的列並為其命名!

 

可以在同一個索引中放置多個列。這就是所謂的復合索引。在索引中放置列的順序對優化器是否使用它有很大影響。稍后我們將討論它的來龍去脈。

 

create index <index_name> on <table_name> ( <column1>, <column2>, … );

 

但首先,讓我們深入研究一下Oracle數據庫中可用的不同類型的索引。

 

如何選擇索引類型

 

Oracle數據庫提供了許多不同類型的索引來改進SQL。您需要做出的一個關鍵決定是使用位圖還是B-tree索引。

默認情況下,索引是B-tree。這些都是平衡的。這意味着所有的葉節點都位於樹中的相同深度。所以訪問任何值的工作量(O(log n))是一樣的。每個葉索引條目都指向一個行。

 

位圖是非常不同的。與 B-tree 一樣,它們存儲索引值。但是,數據庫將每個值與一個rowid范圍相關聯,而不是每個條目對應一行。然后它有一系列的1和0來顯示范圍中的每一行是否有值(1)。

 

Value Start Rowid End Rowid Bitmap
VAL1  AAAA        ZZZZZ     001000000...
VAL2  AAAA        ZZZZZ     110000000...
VAL3  AAAA        ZZZZZ     000111100...
...

注意,開始和結束rowid范圍覆蓋了表中的所有行。但是大型表可能必須將行分割成幾個范圍。所以每個索引值都有許多項。

 

這帶來了一個關鍵的區別,所有索引值為空的行不包括在b樹中。但是它們在位圖中!因此,優化器可以使用位圖來回答查詢如下:

 

where indexed_column is null;
 
位圖的另一個好處是很容易壓縮所有那些1和0。因此,位圖索引通常小於相同的 B-tree 索引。但是如果數據頻繁的插入就有問題了(不能並行-因為頻繁插入數據對位圖索引的性能影響太大了- 所以默認不是位圖索引)
 
 

------------未完待續------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM