普通表轉換分割槽表操作步驟

2021-07-11 01:44:17 字數 4554 閱讀 7630

普通表轉換分割槽表操作步驟

1. 轉分割槽表原因

生產資料庫,一張表,一億多行資料,絕大部分查詢按月為維度做時間範圍查詢,未分割槽狀態下,查詢io量大,

計畫以分割槽截剪的方式減少io量,提公升前前台查詢效能

2. 實施目的

3. 注意事項

(1) 資料庫若是雙節點,只需在其中乙個節點的資料庫上實施。

(2) 實施中部分命令執行時間較長,命令一旦執行後請不要中斷命令的執行一條命令執行完畢後,不能再次重複執行該命令。

4.前期準備 

1).先使用者授權 sql> grant execute on dbms_redefinition to ;

dba使用者授予許可權

sql> grant all on sys.dbms_redefinition to test;

grant succeeded.

sql>  grant create any table, alter any table, drop any table, lock any table, select any table to test;

grant succeeded.

回到test使用者繼續驗證

2).獲取原來表的元資料。可通過dbms_metadata.get_ddl獲取元資料.

3).需要確保預先建立的分割槽能夠存放所有已有資料,否則重定義過程會出錯。

檢視資料時間,重要維度等

--  select min(create_time), max(create_time) from tab;

--  select count(*) from tab where id is null;

--step 1: 建立中間表

中間錶即分割槽表與原來表的資料結構相同,表名不同而已。可以按時間分割槽,如資料按月分割槽。

create table p_t_tab_unpart

(id        varchar2(32)         not null,

create_time          timestamp,

modify_time          timestamp

)partition by range(create_time)

interval(numtoyminterval (1,'month')) –-11g新特性 間隔分割槽

(partition p201601 values less than (to_date('20160201','yyyymmdd'))

);--說明:第乙個引數: schema

--      第二個引數: 原表名

--      第三個引數: 常量

set serveroutput on

prompt "exec dbms_redefinition.can_redef_table"    

exec dbms_redefinition.can_redef_table('testdata', 'tab_unpart', options_flag=>dbms_redefinition.cons_use_pk);

dbms_redefinition.start_redef_table中引數options_flag有

1.dbms_redefinition.cons_use_pk 使用cons_use_pk重定義的時候建立的物化檢視是基於普通的重新整理模式.

2.dbms_redefinition.cons_use_rowid 使用cons_use_rowid重定義的時候建立的物化檢視是基於rowid重新整理的。

--說明:需要拷貝資料,可能需要較長時間

--      第乙個引數: schema 

--      第二個引數: 原表名

--      第三個引數: 臨時表名

--      第四個引數: 常量

prompt "exec dbms_redefinition.start_redef_table" 

exec dbms_redefinition.start_redef_table('testdata','tab_unpart','p_t_tab_unpart',

options_flag=>dbms_redefinition.cons_use_pk);

--step 4: 為每乙個索引註冊依賴物件 

-- 說明:第乙個引數: schema

--       第二個引數: 原表名

--       第三個引數: 臨時表名

--       第四個引數: 常量

--       第五個引數: schema

--       第六個引數: 原表索引名

--       第七個引數: 臨時表索引名

----index: pk_id

begin

dbms_redefinition.register_dependent_object(

uname         => 'testdata',

orig_table    => 'tab_unpart',

int_table     => 'p_t_tab_unpart',

dep_type      => dbms_redefinition.cons_index,

dep_owner     => 'testdata',

dep_orig_name => 'pk_id',

dep_int_name  => 'pk_p_id');

end;

/-- step 5: 拷貝依賴物件

-- 說明:第乙個引數: schema

--       第二個引數: 原表名

--       第三個引數: 臨時表名

--       其它引數: 常量

declare

num_errors pls_integer;

begin

dbms_redefinition.copy_table_dependents(

'testdata', 

'tab_unpart',

'p_t_tab_unpart',

dbms_redefinition.cons_orig_params, true, true, true, true, num_errors, true, true);

end;

/-- step 6: 同步資料,執行重定義後的分割槽資料同步

-- 說明:第乙個引數: schema

--       第二個引數: 原表名

--       第三個引數: 臨時表名

begin

dbms_redefinition.sync_interim_table('testdata', 'tab_unpart', 'p_t_tab_unpart');

end;

/-- step 7: 結束重定義過程

--a.檢查有沒有該錶上的事物,如有則等事物結束

--b.檢查mv日誌,如有很多記錄,則再次執行sync過程

--c.專人監控db情況,此語句超過5s,就要判斷是否停止

begin

dbms_redefinition.finish_redef_table('testdata', 'tab_unpart', 'p_t_tab_unpart');

end;

/--begin

--  dbms_redefinition.abort_redef_table('testdata', 'tab_unpart', 'p_t_tab_unpart');

--end;

-- step 8: 事後處理

-- 主鍵索引處理方法:

-- 1. 原有欄位+分割槽字段,新增local關鍵字。

-- 2. 索引名字不能和原有索引名字重複

prompt "本次主鍵id欄位上建立global index"

--step 9: 檢查是否成功

select table_name,partitioning_type,partition_count

from dba_part_tables where table_name='tab_unpart';

select partition_name,high_value,tablespace_name

from dba_tab_partitions where table_name='tab_unpart'

order by partition_position;

-- step 10: 校驗完資料,刪掉清空中間表

drop table p_t_tab_unpart;

-- step 11: 收集統計資訊

begin

dbms_stats.gather_table_stats(

ownname=>'testdata',

tabname=>'tab_unpart',                               

method_opt=>'for all columns size auto',                       

degree=>dbms_stats.auto_degree,

granularity=>'all',

cascade=>false);

end;

/spool off

普通表變為分割槽表

將已存在資料的普通表轉變為分割槽表,沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,一般可以有三種方法,視不同場景使用 用例 方法一 利用原表重建分割槽表。create table t id number primary key,time date insert into ...

Oracle建立普通表轉換為分割槽表

在oracle中要把表名重名名為字串加上日期格式 使用下面命令 begin execute immediate alter table old table name rename to new table name to char sysdate,yyyymmdd end commit 利用交換表把...

ORACLE普通表轉換成分割槽表的操作

前言 oracle官方建議當表的大小大於2gb的時候就使用分割槽表進行管理,分割槽表相對於小的表管理和效能上都有很大的優勢,本文件暫時不介紹具體的優勢,主要介紹幾種普通表轉換成分割槽表的方法 方法概述 oracle官方給了以下四種操作的方法 a export import method 匯入匯出 b...