91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

oracle分區交換(exchange)技術

發布時間:2020-08-10 18:30:42 來源:ITPUB博客 閱讀:310 作者:記錄每一次錯誤 欄目:關系型數據庫

需求:一個幾億條數據的分區表,要把一些老數據分出來,放一個新建的表上。按時間劃分,指定時間以前的放在老數據表,指定時間以后的數據保留在原表,然后把備份老數據表空間truncate掉。按照分區操作分區交換是最好的解決辦法。

分區交換技術可以實現數據快速轉移,所以在數據加載提速,歷史數據清理等方面特別有用。分區交換技術實際上只修改了數據字典中的數據物理段位置,而不是實際的移動數據,所以速度很快。

創建分區表:
create table t_exchange
(
sno number not null primary key,
oitime date DEFAULT sysdate,
word  varchar2(100)
)
PARTITION BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
 PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
 PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;

歷史分區表:
create table t_exchange_his
(
sno number not null primary key,
oitime date DEFAULT sysdate,
word  varchar2(100)
)
PARTITION BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
 PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
 PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;

插入數據:
begin
   for i in 1..30000 loop
     insert into t_exchange values(i,sysdate,lpad('mingshuo',100,'x'));
   end loop;
dbms_output.put_line('success!');
commit;
end; 
/

創建一些不同類型的索引,觀察分區交換是不是會對索引產生影響:
源表:
創建全局分區索引:
create index t_exchange_idx_01 on t_exchange(sno,oitime,word)
GLOBAL  partition by  range(sno)
(
 partition p01 values less than(10000) tablespace TBS_MING,
 partition p02 values less than(20000) tablespace TBS_MING,
 partition p03 values less than(MAXVALUE) tablespace TBS_MING
);

創建本地非前綴索引:
create index t_exchange_idx_02 on t_exchange(word) local;

創建唯一索引:
create unique index t_exchange_idx_03 on t_exchange(sno,oitime);

歷史表:
創建全局分區索引:
create index t_exchange_his_idx_01 on t_exchange_his(sno,oitime,word)
GLOBAL  partition by  range(sno)
(
 partition p01 values less than(10000) tablespace TBS_MING,
 partition p02 values less than(20000) tablespace TBS_MING,
 partition p03 values less than(MAXVALUE) tablespace TBS_MING
);

創建本地非前綴分區索引:
create index t_exchange__his_idx_02 on t_exchange_his(word) local;

源表與歷史表的區別在于沒有創建唯一索引。
創建中間表:
create table t_exchange_tmp as select * from t_exchange where 1=2; SQL> !ora ddl ming table t_exchange_tmp
\n=============Fri Jun 22 19:31:13 CST 2018===================\n

Session altered. DBMS_METADATA.GET_DDL(UPPER('TABLE'),UPPER('T_EXCHANGE_TMP'),UPPER('MING'))
-------------------------------------------------------------------------------

 CREATE TABLE "MING"."T_EXCHANGE_TMP"
  (    "SNO" NUMBER NOT NULL ENABLE,
       "OITIME" DATE,
       "WORD" VARCHAR2(100)
  ) SEGMENT CREATION DEFERRED
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
 TABLESPACE "TBS_MING"
插入數據之前開啟10046事件跟蹤:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, true);
將數據裝載到中間表:
alter table t_exchange exchange partition p1 with table t_exchange_tmp; 此時的數據:
SQL> select count(*) from t_exchange_tmp;

 COUNT(*)
----------
     9999

SQL> select count(*) from t_exchange partition(p1);

 COUNT(*)
----------
        0 將數據加載到歷史表:
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;

SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp
*
ERROR at line 1:
ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION

創建唯一索引:
create unique index t_exchange_his_idx_03 on t_exchange_his(sno,oitime); 再次加載數據,還是同樣地錯。
觀察一下歷史表和中間表的定義,unique約束只能是sno的主鍵約束了,這個說法不對,只是說明可能是主鍵約束的緣故,中間表增加主鍵約束:
alter table t_exchange_tmp add primary key (sno);

再次加載數據:
SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;

Table altered.
成功! 關閉10046事件:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, false); 數據已經成功從中間表到了歷史表:
SQL> select count(*) from t_exchange_tmp;

 COUNT(*)
----------
        0

SQL> select count(*) from t_exchange_his partition(p1);

 COUNT(*)
----------
     9999 檢查索引:  
SQL> !ora unusable
\n=============Fri Jun 22 19:55:13 CST 2018===================\n

Session altered. UNUSABLE_INDEXES
-------------------------------------------------------------------------
ALTER INDEX MING.SYS_C0012382 REBUILD ONLINE;             --中間表主鍵索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_03 REBUILD ONLINE;    --歷史表的唯一索引
ALTER INDEX MING.SYS_C0012380 REBUILD ONLINE;             --歷史表主鍵索引
ALTER INDEX MING.T_EXCHANGE_IDX_03 REBUILD ONLINE;        --源表的唯一索引
ALTER INDEX MING.SYS_C0012378 REBUILD ONLINE;             --源表主鍵索引
ALTER INDEX MING.T_EXCHANGE__HIS_IDX_02 REBUILD PARTITION P1 ONLINE;   --歷史表的本地非前綴分區索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P03 ONLINE;   --歷史表的全局分區索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P02 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P01 ONLINE;       --源表的全局分區索引
ALTER INDEX MING.T_EXCHANGE_IDX_02 REBUILD PARTITION P1 ONLINE;        --源表的本地非前綴分區索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P01 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P03 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P02 ONLINE;

13 rows selected.  
 
 
總結:
1.從10046中可以看到exchange的過程會以獨占模式(exclusive)鎖住兩張表,不過執行速度很快,也不用擔心阻塞業務dml語句。
2.10046中還考慮ogg和dataguard的影響,都是一些對系統表的修改。
3.裝載到歷史表的時候,需要兩端的表上的約束都要一致。其實也很好理解,這個過程修改的數據字典中的物理位置指向,那么必然要滿足約束的要求,否則加載過去的數據違反了表上的主鍵約束或者唯一約束,那就沒有意義了。
4.所有的索引都失效了,可見這種方法的弊端是雖然數據加載快速,但是索引需要重建,這個就比較致命了。如果表很大的話,分區的可用性會變差,日常交易性能衰退,恢復需要的時間長。

向AI問一下細節

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

AI

宜兰市| 肥东县| 宜昌市| 锦屏县| 大连市| 沙雅县| 盐源县| 华安县| 三河市| 青铜峡市| 陆川县| 奉贤区| 沙雅县| 九江县| 申扎县| 涞水县| 扬州市| 衡东县| 阳朔县| 贡山| 和平区| 宁国市| 兖州市| 昌江| SHOW| 霍山县| 临城县| 准格尔旗| 定兴县| 弥勒县| 中宁县| 桓台县| 象山县| 台南县| 大田县| 建水县| 铁岭市| 北流市| 庄浪县| 苏州市| 海阳市|