本地索引和全域性索引的適用場景
【背景】分割槽表建立好了之後,如果需要最大化分割槽表的效能就需要結合索引的使用,分割槽表有兩種索引:本地索引和全域性索引。既然存在著兩種的索引型別,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的效能的;
本文件透過測試,總結出兩種索引的適合的場景;
【測試環境】
資料庫版本:11.2.0.3
分割槽表的建立指令碼:
- CREATE TABLE SCOTT.PTB
- (
- GG1DM VARCHAR2(9 BYTE),
- SL NUMBER(18,4) ,
- DJBH VARCHAR2(20 BYTE)
- )
- NOCOMPRESS
- PARTITION BY LIST (GG1DM)
- (
- PARTITION PTABLE_P1 VALUES ('07'),
- PARTITION PTABLE_P2 VALUES ('08'),
- PARTITION PTABLE_P3 VALUES ('09')
- )
然後插入大量的資料,再進行統計資訊的更新;
- select t3.table_name, t3.partition_name,t3.high_value,t3.num_rows,t3.blocks,t3.empty_blocks,t3.last_analyzed
- from dba_tab_partitions t3 where t3.table_name='PTABLE' order by t3.num_rows desc;
【開始測試】
測試一、跨分割槽的資料查詢
1.1 建立本地索引(注意:該列不是分割槽的列)
- SQL> CREATE INDEX SCOTT.IN_PTB ON SCOTT.PTB
- (DJBH)
- LOGGING
- LOCAL (
- PARTITION PTABLE_P1
- LOGGING
- NOCOMPRESS ,
- PARTITION PTABLE_P2
- LOGGING
- NOCOMPRESS ,
- PARTITION PTABLE_P3
- LOGGING
- NOCOMPRESS
- )
- SQL> select Segment_NAME,PARTITION_NAME,SEGMENT_TYPE from dba_segments a where a.segment_name='IN_PTB';
- SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
- ---------------- --------------------- ------------------
- IN_PTB PTABLE_P1 INDEX PARTITION
- IN_PTB PTABLE_P2 INDEX PARTITION
- IN_PTB PTABLE_P3 INDEX PARTITION
- LOCAL索引會在每個分割槽上面單獨建立INDEX PARTITION,類似於三個子索引;
進行執行計劃的檢視
- SQL> select count(1) from scott.ptb where djbh='R23NAA002138250';
- COUNT(1)
- ----------
- 512
1.2 建立全域性索引,原先的索引先drop(注意:該列不是分割槽的列)
- SQL> CREATE INDEX SCOTT.IN_PTB_L ON SCOTT.PTB
- (DJBH)
- NOLOGGING
- STORAGE (
- BUFFER_POOL DEFAULT
- FLASH_CACHE DEFAULT
- CELL_FLASH_CACHE DEFAULT
- )
- NOPARALLEL;
- SQL> select Segment_NAME,PARTITION_NAME,SEGMENT_TYPE from dba_segments a where a.segment_name='IN_PTB_L';
- SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
- -------------- --------------------- --------------------
- IN_PTB_L INDEX
進行執行計劃的檢視
需要先重新整理buffer:
- alter system flush buffer_cache;
- select count(1) from scott.ptb where djbh='R23NAA002138250';
測試一總結:以上那種情況因為djbh這一列是需要跨分割槽的,當查詢的條件是需要跨分割槽查詢內容的時候,LOCAL INDEX的效率比GLOBAL INDEX的效率要低,透過consistent gets和db block gets的對比可以看出來;
測試二、分割槽內部的查詢
2.1 分割槽內使用本地索引
- alter system flush buffer_cache;
- select count(1) from scott.ptb where djbh='R23NAA002138250' and GG1DM='07'; #該條件可以確定在單個分割槽裡面
2.2 分割槽內使用全域性索引
- alter system flush buffer_cache;
- select /*+ index(PTB IN_PTB_L) */ count(1) from scott.ptb where djbh='R23NAA002138250' and GG1DM='07';
測試二總結:透過這組實驗可以看出來如果查詢的條件是在單個分割槽裡面查詢的時候,那麼LOCAL INDEX的效率比GLOBAL INDEX的效率要高。
【總結】經過以上的測試可以發現全域性索引和本地索引的使用效率跟查詢條件有直接的影響,建立索引的時候需要根據業務的使用場景進行建立;
而分割槽表的建立也是受使用場景所影響的,所以在建立分割槽表和分割槽索引的時候都需要事先了解業務的需求,儘量把業務需要統計的資訊放在一個同一個分割槽。這樣使分割槽表的效能實現最大化;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-2134128/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle全域性索引和本地索引Oracle索引
- phoenix全域性索引和本地索引 概述,使用場景,區別等詳解索引
- 全域性索引和本地索引的比較索引
- 本地索引、全域性索引、字首索引、非字首索引索引
- [轉]Oracle分割槽索引--本地索引和全域性索引比較Oracle索引
- Oracle分割槽索引--本地索引和全域性索引比較(轉)Oracle索引
- 索引設計(組合索引適用場景)索引
- 分割槽索引之本地(local index)索引和全域性索引(global index)索引Index
- 淺談索引系列之本地索引與全域性索引索引
- 分割槽表全域性索引與本地索引的選擇索引
- 分割槽表本地索引與全域性索引的區別索引
- 全域性索引失效帶來的幾個測試場景索引
- 分割槽表 全域性索引與本地索引失效測試索引
- 分割槽索引和全域性索引(轉載)索引
- 全域性分割槽索引和區域性分割槽索引索引
- 分割槽表、分割槽索引和全域性索引部分總結索引
- 索引失效場景索引
- 全域性索引有缺陷啊索引
- EF Core 索引器屬性(Indexer property)場景及應用索引Index
- multi-key索引和wildCard索引場景比較索引
- SPM適用的場景和示例
- ElasticSearch所使用的倒排索引的思想和使用場景Elasticsearch索引
- 分割槽索引:區域性 locally & 全域性 global索引
- 函式索引的兩個應用場景示例(下)函式索引
- MySQL字首索引和索引選擇性MySql索引
- 刪除分割槽需要更新全域性索引索引
- MongoDB的優勢和適用場景MongoDB
- 分割槽表中的區域性分割槽索引及全域性索引與執行計劃索引
- 大量索引場景下 Easysearch 和 Elasticsearch 的吞吐量差異索引Elasticsearch
- Streaming特性和適用場景
- MySQL系列:索引失效場景總結MySql索引
- Apache Hudi重磅特性解讀之全域性索引Apache索引
- ddl 導致分割槽表全域性索引unusable索引
- 刪除分割槽更新全域性索引使用提醒索引
- mysql 聯合索引的兩種特殊場景MySql索引
- Spark適用於哪些場景?不適用於哪些場景?Spark
- 一文詳解 OceanBase 2.0 的“全域性索引”功能索引
- 關於索引空間的重用的幾個場景索引