背景
分區表創建好了之后,如果需要最大化分區表的性能就需要結合索引的使用,分區表有兩種索引:本地索引和全局索引。既然存在着兩種的索引類型,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的性能的;
本文檔通過測試,總結出兩種索引的適合的場景;
測試環境
數據庫版本: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'; #
- 1
- 2
該條件可以確定在單個分區里面
2.2 分區內使用全局索引
alter system flush buffer_cache; select /*+ index(PTB IN_PTB_L) */ count(1) from scott.ptb where djbh='R23NAA002138250' and GG1DM='07';
- 1
- 2
測試二總結:
通過這組實驗可以看出來如果查詢的條件是在單個分區里面查詢的時候,那么LOCAL INDEX的效率比GLOBAL INDEX的效率要高。
總結
經過以上的測試可以發現全局索引和本地索引的使用效率跟查詢條件有直接的影響,創建索引的時候需要根據業務的使用場景進行創建;
而分區表的創建也是受使用場景所影響的,所以在創建分區表和分區索引的時候都需要事先了解業務的需求,盡量把業務需要統計的信息放在一個同一個分區。這樣使分區表的性能實現最大化;