1. 程式人生 > >Oracle分割槽表管理

Oracle分割槽表管理

–管理分割槽
應對哪種表應用分割槽功能;
1.大於2GB的表
2.含有1000萬條記錄以上的表,表中含有的資料越多,SQL操作的執行速度就會越慢。
3.將會含有大量資料的表。
4.強行拆分後可利於並行操作的表。
5.含有需要定期歸檔日誌或刪除部分的表。

  一條可靠的原則是大大於2GB的表就可以應用分割槽功能。執行下面的查詢命令可以顯示資料庫中佔用空間的排名情況:
   select * from (
   select owner,segment_name,segment_type,partition_name,sum(bytes)/1024/1024
meg_tot from dba_segments group by owner,segment_name,segment_type,partition_name order by sum(extents) desc) where rownum <=10

–建立分割槽表
Oracle 提供了一系列強大的分割槽功能,使用他們可以將表和索引拆分為較小的子集。例如,可以根據日期範圍拆分表中的資料。
–分割槽策略
分割槽型別 描述
範圍 根據日期,數值或字元建立分割槽
列表 根據列表值建立分割槽
雜湊 在沒有明顯分割槽鍵的情況下,以均分方式建立分割槽
組合 組合使用多種分割槽方式
間隔 當新分割槽鍵值超出現存最大範圍時,通過自動分配新分割槽擴充套件範圍分割槽
引用 根據父表列為子表建立分割槽
虛擬列分割槽 在虛擬列上建立分割槽
系統 根據插入資料的應用程式建立分割槽

--按範圍分割槽
使用 CREATE TABLE 語句中的 PARTITION BY RANGE 子句,可以定義居於範圍的分割槽鍵。這可以確定用於控制分區劃分的列。
使用 VALUES LESS THAN 子句可以定義範圍分割槽的上邊界。範圍分割槽中的第一個分割槽沒有下邊界,所有小於VALUES LESS THAN 子句設定值的資料都會插入第一個分割槽。除

了第一個分割槽外,其他分割槽的下邊界都由前一個分割槽的上邊界確定。
還可以使用 MAXVALUE 子句建立範圍分割槽表的最高分割槽。所有分割槽鍵值高於較低範圍的資料都會插入最頂層的 MAXVALUE 分割槽。

 1.將分割槽鍵列設定為 number 型別
    create
table f_sales ( sales_amt number, d_date_id number) partition by range (d_date_id) ( partition p_2012 values less than (20130101), partition p_2013 values less than (20140101), partition p_max values less than (maxvalue));

–在建立範圍分割槽表時,可以不設定MAXVALUE分割槽。然而,如果不設定MAXVALUE分割槽,當插入不在任何範圍內時,系統就會提示下面錯誤:
ORA-14400:inserted partition key does not map to any partition ;
當該錯誤提示出現時,就必須新增一個能夠容納插入資料的範圍分割槽。或者新增一個MAXVALUE分割槽。
–如果你使用Oracle Database 11g或更高的版本,可使用間隔分割槽策略。當插入資料超出範圍值時,Oracle會自動新增分割槽/

 --查詢分割槽表資訊
    select table_name,partitioning_type,def_tablespace_name from user_part_tables where table_name='F_SALES';
    --查詢表中分割槽的資訊
    select table_name,partition_name,high_value from user_tab_partitions where table_name='F_SALES' order by table_name,partition_name;
 2.將分割槽鍵列設定為TIMESTAMP型別
    create table d_sales( sales_amt number,d_date_id date)
    partition by range (d_date_id) (
    partition  p_2012 values less than (to_date('01-01-2012','dd-mm-yyyy')),
    partition  p_2014 values less than (to_date('01-01-2013','dd-mm-yyyy')),
    partition  p_max values less than (maxvalue));

–使用表空間儲存分割槽
每個分割槽建立一個獨立得表空間可以獲得提高可用性和降低管理成本等好處。使用獨立表空間可以控制分割槽得獨立性,可以單獨將分割槽設定為聯機/離線狀態,不依賴其他分割槽對某個分割槽執行備份恢復操作。

 要理解每個分割槽使用獨立表空間的優點,可以考慮不用分割槽表的情況:
    create tablespace p13_tbsp
    datafile '/u02/datafile/p13_tbsp.dbf' size 100m
    extent management local 
    uniform size 128k
    segment space management auto;
--建立一個非分割槽表,儲存到表空間
create table t_sales(
sales_amt number,
d_date_id number
) tablespace p1_tbsp;
--建立一個分割槽表,但是沒有為分割槽設定表空間:
 create table f_sales(
sales_amt number,
d_date_id number
) tablespace p1_tbsp
partition by range(d_date_id)
( partition y2011 values less than (20120101),
  partition y2012 values less than (20130101),
  partition y2013 values less than (20140101));

這種情況下所有的分割槽都儲存在一個表空間中。
這種方法優於使用非分割槽表的方法,使用該方法可以在不影響其他分割槽的情況下,對某個分割槽執行分割槽維護操作,從而確保分割槽的獨立性。然而,該方法並沒有完全利用分割槽功能的優勢。

    將每個分割槽都儲存到獨立的表空間中:
    create table p_sales(
    sales_amt number,
    d_date_id number
    )tablespace p1_tbsp
    partition by range(d_date_id)(
    partition y11 values less than (20120101)
    tablespace p11_tbsp,
    partition y12 values less than (20130101)
    tablespace p12_tbsp,
    partition y13 values less than (20140101)
    tablespace p13_tbsp );
這樣每個分割槽的資料庫都儲存到了它們單獨擁有的表空間和響應的資料檔案中。
--也可以設定其他儲存功能,對錶空間使用了PCTFREE,PCTUSED和NOLOGGING子句
create table p_sales(
sales_amt number,
d_date_id number
)tablespace p1_tbsp
partition by range(d_date_id)(
partition y11 values less than (20120101)
tablespace p11_tbsp pctfree 5 pctused 70 nologging,
partition y12 values less than (20130101)
tablespace p12_tbsp pctfree 5 pctused 70 nologging,
partition y13 values less than (20140101)
tablespace p13_tbsp pctfree 5 pctused 70 nologging);

– pctfree
為一個塊保留的空間百分比,表示資料塊在什麼情況下可以被insert,預設是10,表示當資料塊的可用空間低於10%後,就不可以被insert了,只能被用於update;

即:當使用一個block時,在達到pctfree之前,該block是一直可以被插入的,這個時候處在上升期。
– pctused
是指當塊裡的資料低於多少百分比時,又可以重新被insert,一般預設是40,即40%,即:當資料低於40%時,又可以寫入新的資料,這個時候處在下降期。

    --根據雜湊值分割槽
    對無序和非關係資料使用列表分割槽策略的效果很好。
    使用 partition by list 進行雜湊值分割槽: 
    create table f_sales (
    sales_amt number,
    d_date_id number,
    state_code varchar2(3))
    partition by list (state_code)(
    partition reg_west values ('AZ','CA','CO','MT','OR','ID','UT'),
    partition reg_mid values ('IA','KS','MI','MN','MO','NE','OH'),
    partition reg_def values (default));

這個列表分割槽的分割槽鍵可以僅為一列。使用 DEFAULT列表可以設定儲存不符合列表值得分割槽。如果你沒有設定DEFAULT列表,當插入得資料不符合已定義得分割槽時,
系統就會顯示錯誤提示。

–雜湊分割槽
有時大型表中沒有明顯能夠用於分割槽的列,不論是根據範圍還是根據列表。可以用序列為表新增代理主鍵,並且根據唯一主鍵以平均方式劃分分割槽。這樣做的原因是沒有可用於劃分分割槽的列,或者該表的需求重點是提高插入操作的效率。
使用雜湊分割槽可以根據內部演算法,以平均方式劃分分割槽。你無法控制雜湊演算法和Oracle劃分分割槽的方式。你只能設定分割槽的數量,而Oracle會根據雜湊鍵列均分資料。

使用 create table 語句的 partition by hash 子句,建立雜湊分割槽表: 
create table f_sales(
sales_id number primary key,
sales_amt number)
partition by hash(sales_id)
partitions 2 store in (p11_tbsp,p12_tbsp) ;
drop table f_sales purge;

命名錶空間的雜湊分割槽表: 
create table f_sales(
sales_id number primary key,
sales_amt number)
partition by hash(sales_id)
(partition p1 /*tablespace p11_tbsp*/,
 partition p2 /*tablespace p12_tbsp*/);

雜湊分割槽可以提升效能。擁有相同雜湊鍵值的行會儲存到相同的分割槽。這意味著插入操作的效率特別高,因為雜湊演算法可以確保能夠通過一致的方式為分割槽分配資料。
而且,如果你經常選擇某個特定的鍵值,Oracle就不得不僅通過檢索一個分割槽查詢資料。然而,如果你搜索多個範圍的值,Oracle可能需要搜尋所有分割槽,才能確定需要檢索的行。因此,在雜湊分割槽表中執行範圍搜尋操作的效率會很低。

--組合使用多種分割槽方法
Oracle 允許使用多種策略(組合分割槽)劃分分割槽。例如,你有一個表並想要根據數值範圍為其劃分分割槽。但是你還想根據地區列表為每個分區劃分子分割槽。
drop table f_sales purge; 
create table f_sales(
       sales_amt number,
       state_code varchar2(3),
       d_date_id number)
partition by range (d_date_id)
subpartition by  list(state_code)
(partition p2011 values less than (20120101)(
subpartition p1_north values ('ID','OR'),
subpartition p1_sorth values ('AZ','NM')),
partition p2012 values less than (20130101)(
subpartition p2_north values ('ID','OR'),
subpartition p2_sorth values ('AZ','NM')));

檢視分割槽表型別資訊:
select table_name,partitioning_type,subpartitioning_type from user_part_tables where table_name='F_SALES';
檢視分割槽和子分割槽的資訊:
select table_name,partition_name,subpartition_name from user_tab_subpartitions where table_name='F_SALES' order by table_name,partition_name;

--根據需求建立分割槽
 根據日期新增年間隔分割槽

 create table f_sales (
 sales_amt number,
 d_date_dtt date)
 partition by range(d_date_dtt)
 interval(numtoyminterval(1,'YEAR'))
 store in (p11_tbsp,p12_tbsp,p12_tbsp)
 (partition p1 values less than (to_date('01-01-2013','dd-mm-yyyy'))
 tablespace p12_tbsp);

第一個分割槽是在表空間P1_TBSP中建立的,當Oracle增加分割槽時,他會向STORE IN 子句中定義的表空間分配新建分割槽。
使用 INTERVAL (NUMTOYMINTERVAL(1,’YEAR’))子句設定的間隔是一年。如果插入表中的某個記錄的D_DATE_DTT列值大於或等於01-01-2013,Oracle就會自動在表的
頂端增加新建分割槽。

  --檢查分割槽細節:
     select table_name,partition_name,partition_position,interval,tablespace_name,high_value from user_tab_partitions where table_name='F_SALES' 
            order by table_name,partition_position;
     --插入超出最高分割槽值的資料:
     insert into f_sales values (1,sysdate+10000);
     如果出現高值,Oracle自動建立了一個分割槽。如果不喜歡Oracle自動生成得分割槽名稱,可以重新命名它:
     alter table f_sales rename partition sys_p1321 to p2;
     當插入位於兩個分割槽之間範圍之間得值時,會在新建一個分割槽:
     insert into f_sales values (2,sysdate+2000);

     --根據日期增加星期間隔分割槽
     還可以設定Oracle根據其他時間增加分割槽,如一個星期:
     create table f_sales (
     sales_amt number,
     d_date_dtt date
     )
     partition by range (d_date_dtt)
     interval (numtodsinterval(7,'day'))
     store in (p11_tbsp,p12_tbsp,p13_tbsp)
     (partition p1 values less than (to_date('01-01-2013','dd-mm-yyyy'))
     tablespace p1_tbsp)
    當在未來幾個星期插入資料時,新的星期間隔分割槽就會自動建立,例如:
     insert into f_sales values (1,sysdate+7);
     insert into f_sales values (2,sysdate+14);

     --根據日期增加日間隔分割槽 
     create table f_sales (
     sales_amt number,
     d_date_dtt number
     )
     partition by range (d_date_dtt)
     interval (1)
     (partition p1 values less than (20180320));
     insert into f_sales values (1,20180321);
     insert into f_sales values (2,20180322);
 --管理分割槽
     --移動分割槽
     建立一個列表分割槽:

     create table f_sales 
     (sales_amt number,
      d_date_dtt number,
      state_code varchar2(20))
      partition by list (state_code)
      (partition reg_west values ('AZ','CA','CO','MT','OR','ID','UT'),
       partition reg_mid values('IA','KS','MI','MN','MO','NE','OH'),
       partition reg_rest values (default));
  在分割槽表上建立區域性分割槽索引:
       create index f_sales_index1 on f_sales (state_code) local;
     建立全域性非分割槽索引:
       create index f_sales_index2 on f_sales (sales_amt,sales_id) global;
     建立全域性分割槽索引列:
       create index f_fales_index3 on f_sales (sales_amt)
       global partition by range(sales_amt)
       (partition pg1 values less than (25),
        partition pg2 values less than (50),
        partition pa3 values less than (maxvalue));
    插入測試資料:
    insert into f_sales values (26,1,'AZ');
    insert into f_sales values (51,2,'IA');
    如果要將某個分割槽移動到特定得表空間,可以使用 ALTER TABLE ... MOVE PARTITION 語句重定位分割槽:
    alter table f_sales move partition reg_west  tablespace p1_tbsp;
    將分割槽移動到其他表空間是非常簡單得操作。然而,在執行該操作時,應確保檢查與表有關得所有索引得狀態:
    select b.table_name,a.index_name,a.partition_name,a.status,b.locality
            from user_ind_partitions a, user_part_indexes b where a.index_name=b.index_name and table_name='F_SALES';
 必須重建不可用索引。與手動重建索引不同,在移動分割槽時可以直接使用 update indexes 子句,自動重建與分割槽有關的索引:
    alter table f_sales move partition reg_west tablespace p1_tbsp update indexes;
    /*如果先使用了move 沒有加 update indexes 子句, 會造成F_FALES_INDEX3分割槽索引失效。必須手動重建。如果直接在MOVE的時候加上UPDATE INDEXES 則不會失效*/
    手動重建索引:
    alter index f_fales_index3 rebuild partition pg1;
    alter index f_fales_index3 rebuild partition pg2;
    alter index f_fales_index3 rebuild partition pa3;
    --oracle 12C 開始,可以使用ONLINE子句設定所有索引在移動分割槽時更新;
    alter table f_sales move partition reg_west online tablespace p1_tbsp;
--自動移動更新的行
預設情況下,Oralce不允許更改分割槽鍵,將分割槽中的行移動到其他分割槽。例如,下面的語句更改了分割槽鍵列(D_DATE_ID)的值,以使該分割槽中的行移動到其他分割槽中:
    update f_sales set d_date_id = 20120301 where d_date_id = 20130301;
系統會顯示下面的錯誤:
ORA-14402: updating partition key column would cause a partition change;
ORA-14402: 更新分割槽關鍵字列將導致分割槽的更改;
在這種情況下,使用 ALTER TABLE 語句的 ENABLE ROW MOVEMENT 子句,可以更改分割槽鍵,從而更改分割槽中所含的資料。
    alter table f_sales enable row movement ;
這樣就可以更新分割槽鍵,將分割槽中的行移動到其他分割槽,查詢USER_TABLES 檢視的ROW_MOVEMENT列,驗證行移動功能:
    select table_name,row_movement from user_tables where table_name='F_SALES';
禁用行移動功能:
    alter table f_sales disable row movement;
--為現存的表建立分割槽
轉換方法
create table as select * from 
1.如果要在活動的產品資料庫中建立這個表,應該規劃一些停運時間,確保在遷移資料的過程中不出現活動事務。
2.使用 CREATE TABLE AS SELECT * FROM ORD_TABLE 語句,通過舊錶建立新的分割槽表。
3.刪除或重新命名舊錶。
4.將信標重新命名為舊錶的原名稱。
    建立一個未分割槽表:
    create table f_saels (sales_mnt number,d_date_id number);
    從舊錶獲取資料的新表:
    create table f_sales_new
    partition by range (d_date_id)
    (partition p1 values less than (20130101),
     partition p2 values less than (20140101),
     partition pmax values less than (maxvalue))
     nologging 
     parallel 4
     as select * from f_saels;
 這樣就可以刪除或重新命名舊的非分割槽表,然後將新的分割槽表重新命名未舊錶的名稱。
    drop table f_saels purge;
    rename f_sales_new to f_saels;
最後,微信表建立必須的約束,許可權,索引和統計資料。

–增加分割槽
有時候在建表伊始很難預測需要建立多少個分割槽。典型的例子就是建立不帶MAXVALUE分割槽的範圍分割槽。你可能會因為分割槽表建立足夠使用兩年的分割槽,然後就忘掉了
這張表。在將來的某一天,應用的使用者會報告系統顯示了下列錯誤提示:
ORA-14400:inserted partition key dose not map to any partition ;
ORA-14400:插入的分割槽掛關鍵字未對映到任何分割槽;
–可以使用分割槽間隔功能,在插入資料超出範圍上界時,使Oracle自動建立範圍分割槽。

1.範圍
在處理範圍分割槽表時,如果沒有定義MAXVALUE分割槽,可以使用 ALTER TABLE … ADD PARTITION 語句,在表的上界增加分割槽。如果你不能確定當前的上界值,可以

查詢資料字典:
     select table_name,partition_name,high_value from user_tab_partitions where table_name=UPPER('&TABLE_NAME') order by table_name,partition_name;                   
     --在表分割槽的上界新增一個分割槽:
    alter table f_sales add partition p_2014  values less than (20150101) tablespace p14_tbsp;    
    --從Oracle Database 12c 開始,同時可以向表中新增多個分割槽,例如:    
    alter table f_sales add partition p_2015 values less than (20160101) tablespace p15_tbsp,
                            partition p_2016 values less than (20170101) tablespace p16_tbsp;

–如果現存的分割槽表設定了MAXVALUE分割槽,就無法向該表中新增分割槽。在這種情況下,必須拆分現存的分割槽。

2.列表
在處理列表分割槽表時,只有在沒有定義 DEFAULT 分割槽的情況下,才能增加新分割槽。
向列表分分割槽表新增一個分割槽:

   alter table f_sales add partition reg_east values ('GA');

–Oracle Database 12c 開始,可以同時新增多個分割槽:

 alter table f_sales add partition reg_mid_east values ('TN'),
                           partition reg_north values ('NY');

3.雜湊
處理雜湊分割槽表時,使用ADD PARTITION 子句可以增加分割槽:

   alter table f_sales add partition p5 update indexes;

為雜湊分割槽表增加了分割槽後,就應該檢查索引,確保它們仍舊擁有VALID狀態:

select b.table_name,a.index_name,a.partition_name,a.status,b.locality from user_ind_partitions a ,
          user_part_indexes b where a.index_name=b.index_name and table_name=upper('&part_table');

檢查全域性非分割槽索引的狀態:

   select index_name,status from user_indexes where table_name=upper('&TABLE_NAME');      

–通過現存的表交換分割槽
交換分割槽是以透明方式向大型分割槽表載入資料的常用技巧。使用獨立表與現存的分割槽交換資料,從而在不影響表中其他分割槽的可用性和操作效能的情況下,新增
裝滿資料的新分割槽。

 建立一個範圍分割槽表:
   create table f_sales 
   (sales_amt number,d_date_id number)
   partition by range (d_date_id)
   (partition p1 values less than (20120101),
    partition p2 values less than (20130101),
    partition p3 values less than (20140101));
 --在D_DATE_ID列上建立一個本地點陣圖索引
  create bitmap index d_date_id_fk1 on f_sales(d_date_id) local;
  --向表中新增一個儲存新資料的分割槽
  alter table f_sales add partition p4 values less than (20150101);
  --建立一箇中轉表,將符合新建分割槽範圍條件的資料插入這個中轉表
  create table workpart( sales_amt number,d_date_id number);
  --插入測試資料
  insert into workpart values (100,20140201);
  insert into workpart values (120,20140520);

使用與 f_sales 表上點陣圖索引匹配的結構,在workpart表上建立物點陣圖索引:

  create bitmap index d_date_id_fk2 on workpart(d_date_id);

交換workpart表與P_2014分割槽的資料:

  alter table f_sales exchange partition p4
  with table workpart including indexes without validation;

–驗證結果

  select * from f_sales partition(p4);
  --驗證索引是否依舊有效
  select index_name,partition_name,status from user_ind_partitions;
  --檢視區域性索引段
  select segment_name,segment_type,partition_name from user_segments where segment_name in ('F_SALES','D_DATE_ID_FK1');

–重新命名分割槽

使用 ALTER TABLE 語句重新命名分割槽:

  alter table f_sales rename partition p4 to p_2014;

使用 alter index 重新命名索引分割槽:

  alter index d_date_id_fk1 rename partition p2 to p_2012;

–驗證重新命名的分割槽相關資訊:

  select table_name,partition_name,tablespace_name from user_tab_partitions;

–驗證分割槽索引資訊:

  select index_name,partition_name,status,high_value,tablespace_name from user_ind_partitions;

–拆分範圍分割槽

 使用 ALTER TABLE ... SPLIT PARTITION 拆分現存的範圍分割槽:
  alter table f_sales split partition p2 at (20120601)
  into (partition p2a,partition p2) update indexes;

–驗證分割槽索引的狀態:

  select index_name,partition_name,status from user_ind_partitions;
 --拆分列表分割槽
  alter table f_sales split partition reg_mid values ('IA','KS','MI','MN') into 
  (partition reg_mid_a,partition reg_mid_b) update indexes;
 --合併分割槽
  alter table f_sales merge partitions REG_MID_A,REG_MID_B into partition reg_mid update indexes;
  --如果想快速合併分割槽,可以不加 update indexes 引數,合併完索引後 alter index rebuild partition 重建索引;

–刪除分割槽

 查看錶下的分割槽
  select segment_name,segment_type,partition_name from user_segments where segment_name=upper('&TABLE_NAME');

使用 ALTER TABLE … DROP PARTITION 語句從表中刪除分割槽。

  alter table f_sales drop partition reg_rest;
 --在刪除分割槽時,還需要重建所有全域性索引。
  alter table f_sales drop partition reg_rest update global indexes;
  --如果要刪除子分割槽,可以使用 drop subpartition
  alter table f_sales drop subpartition p1_sorth update global indexes;
  --通過 user_tab_partitions 驗證分割槽是否唄刪除
  select table_name,partition_name from user_tab_partitions;
  --Oracle 不允許刪除組合分割槽表中的所有子分割槽。每個分割槽中至少要保留一個子分割槽

  --統計分割槽資料    Command Windows 執行,Sql Windows 無法執行
  exec  dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname => 'F_SALES',partname => 'P2011');

  --從Oracle Database 11g 開始,在生成全域性統計資訊時,可以使用Oracle僅掃描新增的分割槽,DBMS_STATS 軟體包可以啟動該功能:
  exec dbms_stats.set_table_prefs (user,'F_SALES','INCREMENTAL','TRUE');

 --執行成功後查看錶的首選資訊:
  select dbms_stats.get_prefs('INCREMENTAL',tabname=>'F_SALES') from dual;
  --刪除分割槽中的行
  首先確定要刪除資料的分割槽名稱:
  select segment_name,segment_type,partition_name from user_segments where partition_name is not null ;
  使用 ALTER TABLE ... TRUNCATE PARTITION 語句可以刪除分割槽中的所有記錄。
  alter table f_sales truncate partition Y12;
  --截斷表會使全域性索引失效,可以在使用truncate命令時,更新全域性索引:
  alter table f_sales truncate partition Y12 update global indexes ;
  --如果需要回滾事務,可以使用DELETE語句
  delete from f_sales partition(Y12);

–操作分割槽表中的資料

從特定的分割槽中選擇行:
  select * from f_sales partition(y12);
  如果要從兩個或者多個分割槽中選擇資料,可以使用UNION子句:
  select * from f_sales partition(P2011)
  union
  select * from f_sales partition(P2012); 
  --檢視鍵值屬於哪個分割槽,並顯示改分割槽的資料
  select * from f_sales partition for (20120101); 
  --還可以更新和刪除分割槽行:
  update f_sales partition(p2012) set sales_amt=200;
  update f_sales partition for (20120101) set sales_amt=200;

–索引分割槽
使用表分割槽策略建立索引分割槽

 --測試本地分割槽索引的概念
  --建立測試表,含有兩個分割槽 
  create table f_sales (sales_id number, sales_amt number,d_date_id number)1c
  partition by range(d_date_id)(
  partition p2012 values less than (20130101),
  partition p2013 values less than (20140101)
  );
  --插入測試資料
  insert into f_sales values (1,20,20120322);
  insert into f_sales values (2,33,20120504);
  insert into f_sales values (3,72,20120101);
  insert into f_sales values (4,12,20130322);
  insert into f_sales values (5,98,20130702);
  commit;

  --建立本地索引
  create index f_sales_fk1 on f_sales (d_date_id) local;

  --檢視分割槽索引的資訊
  select index_name,table_name,partitioning_type from user_part_indexes where table_name='F_SALES';

  --檢視本地分割槽索引的資訊
  select index_name,partition_name,tablespace_name from user_ind_partitions where index_name='F_SALES_FK1';

  --在建立索引時,將本地索引儲存到不同的表空間當中
  create index f_sales_fk1 on f_sales (d_date_id) local 
  (partition p2012 tablespace users,
   partition p2013 tablespace p1_tbsp);

如果在建立本地分割槽索引時設定分割槽資訊,那麼必須使用索引分割槽編號與表分割槽編號匹配。
Oracle 會自動同步本地索引分割槽和表分割槽。無法但如增加或刪除本地索引分割槽。在增加或刪除表分割槽時,Oracle會自動執行處理本地索引的操作。Oracle 會自動
管理本地索引分割槽。這與為本地索引分配表空間的方式無關。
本地索引通常在資料庫和DSS環境中使用。如果需要頻繁使用分割槽的列(或列組合)執行查詢命令,就適合使用本地索引。該方法可以使Oracle使用適當的索引和
表分割槽,快速檢索資料。

 本地索引分兩種型別:區域性字首和區域性非字首。區域性字首索引是指索引中的最左側列與表分割槽鍵匹配。
   --字首索引   與分割槽鍵匹配
  create index f_sales_fk1 on f_sales (d_date_id) local; 
  --非字首索引 與分割槽鍵不匹配
  create index f_sales_idx1 on f_sales (sales_id) local;

  通過user_part_indexes檢視的ALIGNMENT列可以驗證索引的型別:
  select index_name,table_name,alignment,locality from user_part_indexes;

–使用與表不同的分割槽策略建立索引分割槽
使用與表不同的分割槽策略建立的分割槽索引稱為全域性索引。全域性索引中的條目可以指向基礎表中的任何分割槽,可以在任何型別的分割槽表上建立全域性索引。
可以使用範圍分割槽策略也可以使用雜湊分割槽策略建立全域性索引。使用關鍵字GLOBAL可以使用與表分割槽策略不同的方式建立索引。在建立範圍分割槽全域性索引時,必須設定
MAXVALUE 分割槽。

create index f_sales_gidx1 on f_sales(sales_amt)
      global partition by range (sales_amt)
      (partition pg1 values less than (25),
       partition pg2 values less than (50),
       partition pg3 values less than (maxvalue));

   --雜湊全域性索引
   create index f_sales_gidx2 on f_sales (sales_id)
   global partition by hash(sales_id) partition 4;

通常,維護全域性索引比維護本地索引更困難,建議避免使用全域性索引,儘可能使用本地索引。
Oracle 不會自動維護全域性索引(像維護區域性索引那樣)。在使用全域性索引時,必須手動新增和刪除索引分割槽。許多對基礎分割槽表執行的維護操作都要重建全域性索引分割槽

–分割槽修剪
分割槽修建可以大幅度提高查詢分割槽表的操作效能。如果SQL查詢命令專門根據分割槽鍵訪問表,那麼Oracle僅會搜尋含有查詢操作所需要的分割槽(而不會訪問含有這些資料
的分割槽,即修剪掉這些分割槽)。

 --建立示例分割槽表:
     create table f_sales(
    sales_id number,
    sales_amt number,
    d_date_id number
    )tablespace p1_tbsp
    partition by range(d_date_id)(
    partition y11 values less than (20120101)
    tablespace p11_tbsp,
    partition y12 values less than (20130101)
    tablespace p12_tbsp,
    partition y13 values less than (20140101)
    tablespace p13_tbsp );

   在分割槽鍵列上建立本地索引
   create index f_sales_fk1 on  f_sales(d_date_id) local;

   --插入測試資料
   insert into f_sales values (1,100,20110202);
   insert into f_sales values (2,200,20120202);
   insert into f_sales values (3,300,20130202);

   --檢視分割槽修剪得過程
   set autotrace trace explain
   select sales_amt from f_sales where d_date_id='20120202';
  xecution Plan
  ----------------------------------------------------------
  Plan hash value: 2403904524

  -------------------------------------------------------------------------------------------- 
  | Id  | Operation                                   | Name        | Bytes | Pstart| Pstop |
  -------------------------------------------------------------------------------------------- 
  |   0 | SELECT STATEMENT                            |             |    26 |       |       |
  |   1 |  PARTITION RANGE SINGLE                     |             |    26 |     2 |     2 |
  |   2 |   TABLE ACCESS BY LOCAL INDEX ROWID BATCHED | F_SALES     |    26 |     2 |     2 |
  |*  3 |    INDEX RANGE SCAN                         | F_SALES_FK1 |       |     2 |     2 |
  -------------------------------------------------------------------------------------------- 

  在這個輸出結果中,Pstart標識初始時訪問得分割槽是2號分割槽。Pstop表名最後訪問得分割槽也是2號分割槽。
  如果查詢操作中沒有分割槽鍵,那麼表中得所有分割槽都會被訪問;
  select * from f_sales;

--------------------------------------------------------------- 
| Id  | Operation             | Name    | Bytes | Pstart| Pstop |
--------------------------------------------------------------- 
|   0 | SELECT STATEMENT    |           |   117 |       |       |
|   1 |  PARTITION RANGE ALL|           |   117 |     1 |     3 |
|   2 |   TABLE ACCESS FULL | F_SALES |   117 |     1 |     3 |
--------------------------------------------------------------- 
在這個結果中,Oracle初始時訪問得分割槽是1號分割槽,而最後一個訪問得分割槽是3號分割槽。這意味著不修建分割槽得情況下,查詢操作會訪問1號到3號得所有分割槽。

相關推薦

Oracle分割槽管理

–管理分割槽 應對哪種表應用分割槽功能; 1.大於2GB的表 2.含有1000萬條記錄以上的表,表中含有的資料越多,SQL操作的執行速度就會越慢。 3.將會含有大量資料的表。 4.強行拆分後可利於並行操作的表。 5

ORACLE分割槽管理的一些筆記

分割槽表的管理筆記(僅限於對普通表,即堆表的分割槽管理,IOT跟CLUSTER TABLE不再討論範圍內) 1. 增加分割槽(add partition)語法是:alter table xxx add partition…需要注意的是如果分割槽中存在maxvalue或default分割槽add partit

2.ORACLE分割槽遷移MySQL分割槽

介紹 由於MySQL沒有類似於ORACLE間隔分割槽類似的功能,所以遷移分割槽表的時候工作量較大,下面就把常用到的一些工具指令碼及操作過程列在下面。 操作 1 修改分割槽表定義 ORACLE增加了間隔分割槽功能,可以在資料插入的時候自動新增分割槽,但是MySQL就不具備這個功

匯入匯出 Oracle 分割槽資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

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

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

ORACLE分割槽梳理系列(一)- 分割槽概述、分類、使用方法及注意事項

前言 本文著重闡述分割槽表的概念、優勢,以及常用分割槽表的使用方法及使用過程中的注意事項。 對於分割槽表的日常維護方法,如:索引的維護、分割槽的合併等,將在後續文章中再詳細介紹。 本文涉及的相應演示,使用的資料庫版本為oracle 11.2.0.4。 本文常用分割槽表的使

Oracle 分割槽——Range分割槽

本博文少許理論資料來至DBA技術大牛http://blog.csdn.net/tianlesoftware/article/details/4717318,本著實踐式學習,書寫以下博文: 一、什麼是分割槽表        Oracle提供了分割槽技術以支援VLDB(Ver

Oracle 分割槽的索引、分割槽索引

Oracle 分割槽表的索引、分割槽索引 對於分割槽表,可以建立不分割槽索引。也就是說表分割槽,但是索引不分割槽。以下著重介紹分割槽表的分割槽索引。 索引與表一樣,也可以分割槽。索引分為兩類:locally partition index(區域性分割槽索引)、globally partiti

Oracle分割槽(二)

【轉自:http://linux.chinaunix.net/techdoc/database/2007/11/14/972229.shtml, 部分內容調整並排版】 1.分割槽表的維護注意事項 若分割槽表跨不同表空間,做匯出、匯入時目標資料庫必須預建這些表空間。分表區各區

oracle 分割槽放入不同的空間

  查詢分割槽:Select *From user_extents WHERE partition_name='分割槽名'; 1)建立表空間 create tablespace HRPM0 datafile '/oradata/misdb/HRPM0.DBF' size 5m autoextend

Oracle分割槽刪除分割槽資料時導致索引失效解決

一、描述      今天有個小任務就是要刪除些資料,哈哈,先自己小開心一下。因為要刪除的資料表是我之前轉換成的分割槽表。這個分割槽表是按照裡面有個建立時間欄位來分割槽的,1個季度為1個分割槽。所以我現在要將2017年7月1日之前的資料刪除(資料量約1000萬),可以直接刪除表

Oracle分割槽分割槽互動技術實現資料快速轉移

有一個需求,將某業務表的某個時間點之前的記錄轉移到它的歷史表中。如果當前業務表不是基於這個業務時間點的分割槽表設定,那隻能insert再delete操作。這種轉移資料的方法非常非常低基礎。經常在初級的資料庫管理人員和開發人員的程式中出現。不是說這個方法不好,對於轉移的記錄數量

分割槽刪除分割槽對索引的影響(Oracle分割槽刪除分割槽資料時導致索引失效解決)

http://www.itpub.net/thread-1942951-1-1.html在oracle中,建立分割槽表,然後建立索引的時候有全域性索引和本地索引,因為需要定時刪除分割槽,所以建立本地索引,可以在查詢的時候走索引,那麼全域性索引的意義是什麼?據說全域性索引會快,

ORACLE分割槽分割槽索引詳解

ORACLE分割槽表、分割槽索引ORACLE對於分割槽表方式其實就是將表分段儲存,一般普通表格是一個段儲存,而分割槽表會分成多個段,所以查詢資料過程都是先定位根據查詢條件定位分割槽範圍,即資料在那個分割槽或那幾個內部,然後在分割槽內部去查詢資料,一個分割槽一般保證四十多萬條

[Oracle命令] 管理

Oracle表管理 一、Oracle資料庫資料型別 二、建立表   1.語法如下: CREATE TABLE [ schema.]table_name ( Column_name data_type [ DEFAULT expression ] [

Oracle 分割槽相關語法

Oracle offers six different ways to partition your table data: range partition interval partition hash partition list

Oracle-分割槽案例

Oracle資料庫開發瞭解分割槽表 分割槽就是將一個非常大的表或者索引物理地分解為多個較小的 可獨立管理的部分. 分割槽表或索引在邏輯上是一個表或一個索引,但物理上是由多個物理分割槽組成的. 分割槽功能通過改善可管理性 效能 可用性,為各種應用系統帶來了極大的好處. 分割槽

oracle分割槽的使用和查詢

select object_name,object_type,tablespace_name,sum(value) from v$segment_statistics where statistic_name IN ('physical reads','physical write','logical rea

Oracle分割槽修改分割槽

declare  l_str varchar2(8);begin    for x in (select distinct partition_name from user_tab_partitions where table_name='T_DW_XA_GLOG_SHOPTRADE' and partiti

oracle分割槽

oracle分割槽表 分割槽原則:當資料量超過2000W時,可以考慮使用分割槽表 原理:將一張表分成好幾個區域(表空間劃分的磁碟空間) 作用:提高效率 分割槽表儘量建表時建立, 如果是後期優化時建分割槽表,一定要先備份 分割槽型別 型別描述 range: 按照範圍分割槽,通常是按照時間欄位分割槽