索引
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;
------------未完待續------------