oracle的局部本地分區索引
阿新 • • 發佈:2017-10-01
reat ins 證明 ble system nullable log rac list
環境:oracle 12.2.0.1
註:未確定10g,11g是否有這些特性。現在基本不用10g,主要用12c,11g。
毫無疑問,這種 特性對於dba或者實施人員而言顯得很重要,尤其當你的數據庫主要用於olap或者dw(數據倉庫)環境的時候。
很多時候,如果需要在一個巨大的表上創建新的索引,例如這個表示一個基站性能數據,可能整張表有3-5億條。
如果按照以往的操作,明顯是非常可怕的事情:
- 消耗巨量的時間
- 不一定成功
- 可能影響業務的進行
然後,有了局部本地分區索引就不一樣了。
以下就是本人的試驗!
1 create table t_tab_columns( 2 owner varchar2(128) NOT NULL, 3 table_name varchar2(128) NOT NULL, 4 column_name varchar2(128) NOT NULL, 5 data_type varchar2(128), 6 data_type_mod varchar2(3), 7 data_type_owner varchar2(128), 8 data_length number, 9 data_precision number,10 data_scale number, 11 nullable varchar2(1), 12 column_id number, 13 default_length number, 14 num_distinct number, 15 collation varchar2(100) 16 ) 17 partition by list(owner) 18 ( 19 partition p_sys values (‘SYS‘,‘SYSTEM‘) , 20 partition p_sys_other values(‘MDSYS‘,‘CTXSYS‘,‘DVSYS‘,‘WMSYS‘,‘LBACSYS‘) indexing off, 21 partition p_USERS values (‘LZF‘,‘EMCUSER‘) 22 ); 23 24 --- 25 INSERT INTO t_tab_columns 26 select 27 owner, 28 table_name, 29 column_name, 30 data_type, 31 data_type_mod, 32 data_type_owner, 33 data_length, 34 data_precision, 35 data_scale, 36 nullable, 37 column_id, 38 default_length, 39 num_distinct, 40 collation 41 from dba_tab_columns 42 WHERE OWNER IN (‘SYS‘,‘SYSTEM‘,‘MDSYS‘,‘CTXSYS‘,‘DVSYS‘,‘WMSYS‘,‘LBACSYS‘,‘LZF‘,‘EMCUSER‘); 43 commit; 44 ---2.1創建索引 45 create index idx_Tab_columns_colname on t_tab_columns(column_name) local indexing partial 46 --驗證 47 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_COLNAME‘; 48 SEGMENT_NAME PARTITION_NAME 49 IDX_TAB_COLUMNS_COLNAME P_SYS 50 IDX_TAB_COLUMNS_COLNAME P_USERS 51 --**** 證明:有起到作用 52 --2.2 創建索引而不帶 indexing partial 53 create index idx_Tab_columns_dt on t_tab_columns(data_type) local ; 54 --驗證 55 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_DT‘; 56 SEGMENT_NAME PARTITION_NAME 57 IDX_TAB_COLUMNS_DT P_SYS 58 IDX_TAB_COLUMNS_DT P_SYS_OTHER 59 IDX_TAB_COLUMNS_DT P_USERS 60 --**** 證明:是否創建索引完全取決於 indexing partial 字句。 61 --2.3 如果把本來可以索引的,調整為不可索引,會如何了? 62 alter table t_tab_columns modify partition p_users indexing off; 63 --驗證 64 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_COLNAME‘; 65 SEGMENT_NAME PARTITION_NAME 66 IDX_TAB_COLUMNS_COLNAME P_SYS 67 68 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_DT‘; 69 SEGMENT_NAME PARTITION_NAME 70 IDX_TAB_COLUMNS_DT P_SYS 71 IDX_TAB_COLUMNS_DT P_SYS_OTHER 72 IDX_TAB_COLUMNS_DT P_USERS 73 --**** 證明:只影響采用了 indexing partial的索引,會刪除對應分區的索引。 74 75 --2.4 如果把本來不可以索引的,調整為可索引,會如何了? 76 alter table t_tab_columns modify partition p_users indexing on; 77 --驗證 78 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_COLNAME‘; 79 SEGMENT_NAME PARTITION_NAME 80 IDX_TAB_COLUMNS_COLNAME P_SYS 81 IDX_TAB_COLUMNS_COLNAME P_USERS 82 select segment_name,partition_name from user_segments where segment_name=‘IDX_TAB_COLUMNS_DT‘; 83 結果略。 84 --**** 證明:修改表分區的indexing屬性,只影響采用了 indexing partial的索引,會重建對應分區的索引。
通過修改所有分區的indexing 屬性(為off),然後創建indexing partial對的本地索引,最後通過一個定時任務把對應分區修改為indexing on,就可以逐步創建每個分區的索引。
oracle的局部本地分區索引