淺談索引系列之本地索引與全域性索引
分割槽表按照型別可以分為範圍分割槽(Range)、列表分割槽(List)以及雜湊分割槽(Hash),表被分割槽後,其對應的索引也會與普通表的索引有所不同。
基本概念
對於分割槽表上的索引可以分為兩類:本地索引和全域性索引。其中全域性索引又可以分為分割槽索引和未分割槽索引,而本地索引必須為分割槽索引。因此若某個索引未分割槽,可以直接斷定其為全域性索引;若已分割槽,在根據具體情況進行判斷。官方截圖如下:本文重點說明Local Partitioned Index(為配合上圖此處才這麼寫,可以簡寫為Local Index,因為Local Index一定是分割槽的)和Global Partitioned Index的基本概念原理以及其對應使用的場景。
本地索引的分割槽機制與表的分割槽機制一樣:其分割槽鍵與分割槽表的分割槽鍵相同,同樣分割槽個數與基表分割槽個數也相同,因此本地索引分割槽情況與基表一模一樣。
全域性分割槽索引分割槽鍵以及分割槽個數與基表可能不同,另外全域性分割槽索引必須為字首索引,即其索引分割槽鍵必須為索引的前幾列。
用文字描述比較枯燥,難於理解,下圖比較形象的說明了兩者以及兩者的區別。
Local Index global Partition Index
應用場景
那麼本地索引和全域性分割槽索引或全域性索引究竟適用於什麼場景呢?,下面以本地索引和全域性索引(非分割槽)為例進行說明:1. 新建測試以ID為分割槽鍵的範圍分割槽表T_PARTITION,具體表結構如下:
desc t_partition;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
DATA VARCHAR2(100)
T_PARTITION以列ID間隔100分別建立了10個分割槽,如下
點選(此處)摺疊或開啟
-
SQL> SELECT count(*) FROM user_tab_partitions WHERE table_name='T_PARTITION';
COUNT(*)
----------
1000
點選(此處)摺疊或開啟
-
SQL> SELECT count(*) FROM t_partition;
-
-
COUNT(*)
-
----------
- 11030039
本地索引:
點選(此處)摺疊或開啟
- create index ind_l_data on t_partition(data) local;
- Index created.
點選(此處)摺疊或開啟
-
SELECT table_name,locality,alignment FROM user_part_indexes WHERE index_name='IND_L_DATA';
-
TABLE_NAME LOCALITY ALIGNMENT
-
---------------- ----------- ------------
-
T_PARTITION LOCAL NON_PREFIXED
-
-
SELECT count(*) FROM user_ind_partitions t WHERE index_name='IND_L_DATA';
COUNT(*)
----------
1000
點選(此處)摺疊或開啟
- drop index ind_l_data;
- create index ind_g_data on test_partition(data);
- Index created.
分為兩種情況比較,一種情況查詢謂詞中帶有基表的分割槽鍵,另外一種不帶基表分割槽鍵,先看條件不帶分割槽鍵的情況:
本地索引:
全域性索引:
透過上面兩個圖輸出的統計資訊,可以看到邏輯讀(consistent gets)全域性索引明顯要比本地索引邏輯讀少,全域性索引的效率更高。
下面再觀察一下謂詞中帶有分割槽鍵的情況:
本地索引:
全域性索引:
相差不大,相對來說本地索引效能比全域性索引效能更好一下。
全域性索引和本地索引各自有各自的特點,使用場景不同,DBA應根據具體的業務情況建立相應的索引,另外從Oracle官方可以找到關於本地索引和全域性索引的一點點建議:
由此推斷:全域性索引多用於OLTP系統,而本地索引都用於OLAP系統。
維護注意事項
1.本地索引可以為字首索引和非字首索引,全域性索引必須為字首索引。如下我們全域性索引建立在data列,透過id列分割槽,系統報錯GLOBAL partitioned index must be prefixed.2.只要查詢條件中包含了基表的分割槽鍵,非字首、字首索引都支援分割槽消除。
3.本地索引由Oracle自動管理,當有新增、刪除、合併分割槽、截斷分割槽資料等操作,本地索引自動更新,但全域性索引不會自動更新,一旦有上述操作請記得新增update global indexes語句,若不新增索引就會變得不可用。
本地索引:
全域性索引:
可以看到若不新增update global indexes,全域性索引狀態會變為不可用,因此在日常維護全域性索引過程中請注意此問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29827284/viewspace-2135242/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談索引系列之索引重建索引
- 本地索引、全域性索引、字首索引、非字首索引索引
- Oracle全域性索引和本地索引Oracle索引
- 全域性索引和本地索引的比較索引
- 分割槽表全域性索引與本地索引的選擇索引
- 分割槽表本地索引與全域性索引的區別索引
- 分割槽表 全域性索引與本地索引失效測試索引
- [轉]Oracle分割槽索引--本地索引和全域性索引比較Oracle索引
- Oracle分割槽索引--本地索引和全域性索引比較(轉)Oracle索引
- 分割槽索引之本地(local index)索引和全域性索引(global index)索引Index
- 本地索引和全域性索引的適用場景索引
- 淺談索引系列之基本原理索引
- 淺談聚簇索引與非聚簇索引索引
- 淺談MySQL的B樹索引與索引優化MySql索引優化
- 分割槽索引和全域性索引(轉載)索引
- 淺談Mysql索引MySql索引
- 淺談sql索引SQL索引
- phoenix全域性索引和本地索引 概述,使用場景,區別等詳解索引
- 全域性分割槽索引和區域性分割槽索引索引
- FAQ系列|MySQL索引之聚集索引MySql索引
- MySQL淺談(索引、鎖)MySql索引
- 淺談索引系列之聚簇因子(clustering_factor)索引
- 全域性索引有缺陷啊索引
- Apache Hudi重磅特性解讀之全域性索引Apache索引
- 分割槽表、分割槽索引和全域性索引部分總結索引
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- 分割槽表中的區域性分割槽索引及全域性索引與執行計劃索引
- 淺談oracle中重建索引 (ZT)Oracle索引
- MySQL索引系列:全文索引MySql索引
- 分割槽索引:區域性 locally & 全域性 global索引
- mysql索引之字首索引MySql索引
- 淺談索引序列之是否可以儲存NULL值?索引Null
- 刪除分割槽需要更新全域性索引索引
- MongoDB之索引(地理資訊索引)MongoDB索引
- MongoDB之索引(全文索引)MongoDB索引
- MongoDB之索引(過期索引)MongoDB索引
- MongoDB之索引(唯一索引)MongoDB索引
- sql server 索引闡述系列七 索引填充因子與碎片SQLServer索引