中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

將非分區表轉化成分區表

發布時間:2020-07-30 10:33:09 來源:網絡 閱讀:659 作者:lineqi 欄目:關系型數據庫

將非分區表轉化成分區表幾種實現方式

1、insert into 分區表 select * from 非分區表

SQL> select * from ttpart;


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;


SQL> insert /*+ append */ into tt_part select * from ttpart;


4 rows created.


SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46


SQL>  select * from tt_part partition(p_ttpart01);


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


2、expdp/impdp


SQL> select * from tttt;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;

[oracle@orcl impdp]$ expdp lineqi/lineqi directory=impdp_dir dumpfile=lineqi_tttt.dmp tables=\(TTTT\)

[oracle@orcl impdp]$ impdp lineqi/lineqi directory=impdp_dir dumpfile=lineqi_tttt.dmp REMAP_TABLE=lineqi.tttt:lineqi:tt_part TABLE_EXISTS_ACTION=append;

SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

SQL>  select * from tt_part partition(p_ttpart01);


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


SQL> select * from tt_part partition(p_ttpart02);


        ID V_DATE

---------- -------------------

         1 2016-09-10 14:23:55


3、分區交換技術


SQL> select * from tttt;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;

SQL> select table_name,partition_name from user_tab_partitions where table_name='TT_PART';


TABLE_NAME                 PARTITION_NAME

-------------------- -----------------------

TT_PART                      P_TTPART01

TT_PART                      P_TTPART02

TT_PART                      P_TTPART03



SQL> alter table tt_part exchange partition P_TTPART03  with table tttt;

alter table tt_part exchange partition P_TTPART03  with table tttt

                                                              *

ERROR at line 1:

ORA-14099: all rows in table do not qualify for specified partition


上面交換時報錯,是因為非分區表中的數據不滿足分區表中存放條件,這時可以加上without validation選項進行交換。但數據在分區表中的存放與進行分區時的條件不符合。

SQL> alter table tt_part exchange partition P_TTPART03  with table tttt without validation;


Table altered.


SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

SQL> select * from tt_part partition(P_TTPART02);


no rows selected

從下面可以看出所有的記錄都存放在P_TTPART03

SQL>  select * from tt_part partition(P_TTPART03);


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

下面查詢非分區表,則沒有任何記錄。

SQL> select * from tttt;


no rows selected

分區交換技術其實是修改數據字典來完成操作的,Global索引或涉及到數據改動了的global索引分區會被置為unusable,除非附加update indexes子句。



4、在線重定義技術


給用戶授權

SQL>GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE, DROP ANY TABLE, LOCK ANY TABLE  ,SELECT ANY TABLE,CREATE ANY INDEX,CREATE ANY TRIGGER TO lineqi;


SQL> GRANT EXECUTE_CATALOG_ROLE TO lineqi;



SQL> exec dbms_redefinition.can_redef_table('LINEQI','TTTT',dbms_redefinition.cons_use_rowid);

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART');

 

begin dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART'); end;

 

ORA-12089: 不能聯機重新定義無主鍵的表 "LINEQI"."TTTT"

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 56

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1498

ORA-06512: 在 line 2

通過rowid來重定義表失敗

alter table tttt add constraint pk_id primary key (id)

 

SQL> exec dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART'); 將TTTT中的數據插入到分區表tt_part表中

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.sync_interim_table('LINEQI','TTTT','TT_PART');同步將TTTT中的數據插入到分區表tt_part表時所產生的新數據

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.finish_redef_table('LINEQI','TTTT','TT_PART');結束同步


 

PL/SQL procedure successfully completed

說明:TESTRE是要進行重定義的表,TTTT是與TESTRE相同表結構的分區表

同步結束之前的情況

select * from user_objects t where t.OBJECT_NAME in ('TTTT','TESTRE')

OBJECT_NAME      SUBOBJECT_NAME  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE 

TESTRE 89319   89319 TABLE

TTTT 89232 T TABLE

TTTT P_TTPART01 89233 89320 TABLE PARTITION

TTTT P_TTPART02 89234 89321 TABLE PARTITION

TTTT P_TTPART03 89235 89322 TABLE PARTITION


同步結束之后的情況

TESTRE 89232 TABLE

TESTRE P_TTPART01 89233 89320 TABLE PARTITION

TESTRE P_TTPART02 89234 89321 TABLE PARTITION

TESTRE P_TTPART03 89235 89322 TABLE PARTITION

TTTT 89319 89319 TABLE


其實是交換相應對象的object_id,data_object_id


--優點:

--保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。

--只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。

--而且,可以在切換前進行相應的授權并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。

--

--不足:實現上比上面兩種略顯復雜,適用于各種情況。

--然而,在線表格重定義也不是完美無缺的。下面列出了Oracle9i重定義過程的部分限制:

--你必須有足以維護兩份表格拷貝的空間。   

--你不能更改主鍵欄。   

--表格必須有主鍵。   

--必須在同一個大綱中進行表格重定義。   

--在重定義操作完成之前,你不能對新加欄加以NOT NULL約束。   

--表格不能包含LONG、BFILE以及用戶類型(UDT)。   

--不能重定義鏈表(clustered tables)。   

--不能在SYS和SYSTEM大綱中重定義表格。   

--不能用具體化視圖日志(materialized VIEW logs)來重定義表格;不能重定義含有具體化視圖的表格。   

--不能在重定義過程中進行橫向分集(horizontal subsetting)



補充分區合并


SQL> alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart02;

alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart02

                                    *

ERROR at line 1:

ORA-14275: cannot reuse lower-bound partition as resulting partition



SQL> alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart03;


Table altered.

SQL> select table_name,partition_name from user_tab_partitions where table_name='TESTRE';

TABLE_NAME                  PARTITION_NAME

--------------------- ---------------------

TESTRE                      P_TTPART01

TESTRE                      P_TTPART03


分裂分區


SQL> alter table testre split partition P_TTPART03 at (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) into (partition p_ttpart02 tablespace 


test,partition p_ttpart03);


Table altered.

上面partition p_ttpart02 tablespace test并沒有之后創建好,而是在split時創建的。之前在做split時是手動把partition p_ttpart02分區表建立好的,結果做split直接報


下面錯誤。

ORA-14080: partition cannot be split along the specified high bound


SQL> col table_name for a35

SQL> col partition_name for a40

SQL> select table_name,partition_name from user_tab_partitions where table_name='TESTRE';


TABLE_NAME                          PARTITION_NAME

----------------------------------- ----------------------------------------

TESTRE                              P_TTPART01

TESTRE                              P_TTPART02

TESTRE                              P_TTPART03


SQL> select * from testre partition(p_ttpart03);


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46


SQL>  select * from testre partition(p_ttpart02);


        ID V_DATE

---------- -------------------

         2 2016-09-10 14:23:55

對于某一個分區中有大量數據時,最好在業務空閑時間去做,并且split后記得查詢索引狀態是否有效


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚松县| 佛坪县| 东莞市| 阿克陶县| 根河市| 安庆市| 调兵山市| 河池市| 元谋县| 保山市| 兰西县| 兴业县| 柘城县| 城固县| 建平县| 宣城市| 鲁山县| 临澧县| 察隅县| 探索| 内乡县| 鱼台县| 深水埗区| 永靖县| 衡阳市| 清原| 思茅市| 九龙县| 鹰潭市| 崇明县| 杂多县| 宁明县| 藁城市| 望城县| 南皮县| 龙南县| 芒康县| 大田县| 潜江市| 吴桥县| 高要市|