oracle分割槽表中本地索引和全域性索引的適用場景

2021-08-28 08:01:28 字數 3221 閱讀 2816

【背景】分割槽表建立好了之後,如果需要最大化分割槽表的效能就需要結合索引的使用,分割槽表有兩種索引:本地索引和全域性索引。既然存在著兩種的索引型別,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的效能的;

本文件通過測試,總結出兩種索引的適合的場景;

【測試環境】

資料庫版本: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')

然後插入大量的資料,再進行統計資訊的更新;

【開始測試】

測試一、跨分割槽的資料查詢

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 wherea.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,類似於三個子索引;

進行執行計畫的檢視

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 wherea.segment_name='in_ptb_l';

segment_name partition_name         segment_type

in_ptb_l             index

進行執行計畫的檢視

需要先重新整理buffer:

測試一總結:以上那種情況因為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 分區內使用全域性索引

測試二總結:通過這組實驗可以看出來如果查詢的條件是在單個分割槽裡面查詢的時候,那麼local index的效率比global index的效率要高。

【總結】經過以上的測試可以發現全域性索引和本地索引的使用效率跟查詢條件有直接的影響,建立索引的時候需要根據業務的使用場景進行建立;

而分割槽表的建立也是受使用場景所影響的,所以在建立分割槽表和分割槽索引的時候都需要事先了解業務的需求,盡量把業務需要統計的資訊放在乙個同乙個分割槽。這樣使分割槽表的效能實現最大化;

Oracle 分割槽表中索引失效

當對分割槽表進行 一些操作時,會造成索引失效。當有truncate drop exchange 操作分割槽 時全域性索引 會失效。exchange 的臨時表沒有索引,或者 有索引,沒有用including indexes的關鍵字,會導致區域性的索引失效,就是某個分割槽失效 重建區域性索引只能用alt...

Oracle建立分割槽表和全域性索引

分割槽表概念 當表中的資料量不斷增大,查詢資料的速度就會變慢,應用程式的效能就會下降,這時就應該考慮對錶進行分割槽。表進行分割槽後,邏輯上表仍然是一張完整的表,只是將表中的資料在物理上存放到多個表空間 物理檔案上 這樣查詢資料時,不至於每次都掃瞄整張表。按照start time欄位以一年為跨度建立分...

Oracle分割槽表

1 範圍分割槽 range create table range part tab id number,deal date date,area code number,contents varchar2 4000 partition by range deal date partition p201...