給你個思路,先修改B表的表結(jié)構(gòu),增加A表中的兩個列,然后更新B表,用來將A表中的數(shù)據(jù)插入到B表中對應(yīng)的列。
成都創(chuàng)新互聯(lián)專注于岐山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城系統(tǒng)網(wǎng)站開發(fā)。岐山網(wǎng)站建設(shè)公司,為岐山等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
with?sleest?as(
select?1?rn,1111111111??a,?1?b,?'c1'?c?,'d1'?d?from?dual
union?all
select?2,222222?,?3?,?'c2'?,'d2'?from?dual
)
--select?*?from?sleest;
select?distinct
--new_rn第一條存值,后續(xù)為空
case?when?levels.column_value?1?then?null?else?t.rn?end?as?new_rn,??
t.rn,
levels.column_value?as?sub_order,??
--4可以通過參數(shù)傳遞
trim(regexp_substr(t.a,?'(.{1,4})',?1,?levels.column_value))??as?a,??
t.b,
--c第一條存值,后續(xù)為空
case?when?levels.column_value?1?then?null?else?t.c?end?as?c?,
t.d
from?sleest?t,
table(
cast(
multiset(
--4可以通過參數(shù)傳遞
select?level?from?dual?connect?by??level?=?length(regexp_replace(trim(regexp_replace(t.a,'(.{4})','\1?')),?'[^?]+'))??+?1
)?as?sys.OdciNumberList
)
)?levels
order?by?rn,?sub_order
構(gòu)造臨時數(shù)據(jù):
根據(jù)需求參數(shù)4進行劃分:
參考stackover上的一個解決方案改的,原文地址如下:
create sequence seq_id start with 1000 increment by 1 ;
update t set id=seq_id.nextval ;
1000w可能會稍微慢點,正常,看你的存儲如何了,
修改表名:
alter table 表名 rename to 新名
添加字段:
alter table 表名 add 字段名 字段類型
刪除字段:
alter table 表名 drop column 字段名
修改字段:
alter table 表名 rename column 原字段名 to 新名;
修改字段類型(前提:表中無數(shù)據(jù))
alter table 表名 modify 字段名 新類型;
例如:String deleteColumn="alter table t_user drop column sname";
reorg 通過重構(gòu)行來消除“碎片”數(shù)據(jù)并壓縮信息,對表進行重組。 還有一個功能就是可以將表中的數(shù)據(jù)按照某個索引關(guān)鍵字的順序排列,從而可以減少某些查詢i/o數(shù)量。 當數(shù)據(jù)庫里某個表中的記錄變化量很大時,需要在表上做REORG操作來優(yōu)化數(shù)據(jù)庫性能,值得注意的是,針對數(shù)據(jù)庫對象的大量操作,如反復(fù)地刪除表,存儲過程,會引起 系統(tǒng)表中數(shù)據(jù)的頻繁改變,在這種情況下,也要考慮對系統(tǒng)表進行REORG操作。
執(zhí)行REORG可以考慮分為表上有索引和沒有索引兩種情況:
1) 如表名為DB2INST1.STAFF,索引名為DB2INST1.ISTAFF
SQL:reorg table db2inst1.staff index db2inst1.istaff use tempspace1
建議REORG時使用USE參數(shù)指定數(shù)據(jù)重排時使用的臨時表空間,否則,REORG工作將會在表所在表空間中原地執(zhí)行.如果表上有多個索引,INDEX參數(shù)值請使用最為重要的索引名.
2)表上沒有索引:
reorg table db2inst1.staff use tempspace1
reorg table sysibm.systables use tempspace1
alter table tablename move [tablespace tablespacename];
delete數(shù)據(jù)不會回收已經(jīng)分配出去的block(也就是delete前后你查看user_segments中的信息不會有改動)。
但這時你對表執(zhí)行analyze后查看dba_tables表的話會發(fā)現(xiàn)empty_block數(shù)目變大或者avg_space數(shù)據(jù)變小。
如果你希望減少該table占用的實際block數(shù)目,
你需要使用move操作將table重建,oracle才會重新分配block,這時table上的索引會失效,需要rebuild。
一,創(chuàng)建測試環(huán)境
1.1 創(chuàng)建測試表,為其插入16萬條記錄
create table jax_t11
as
select * from dba_objects
where rownum = 10000;
insert into jax_t11
select * from jax_t11;
commit;
insert into jax_t11
select * from jax_t11;
commit;
insert into jax_t11
select * from jax_t11;
commit;
insert into jax_t11
select * from jax_t11;
commit;
1.2 創(chuàng)建索引
create index idx_jax_t11_01 on jax_t11(owner,object_name,created);
1.3 分析表及索引
begin
dbms_stats.gather_table_stats
( ownname = user, -- 表的擁有者
tabname = upper('jax_t11'), -- 表名稱
method_opt = 'for all indexed columns size 1', -- 獲得所有索引列的柱狀圖
cascade = TRUE ); -- 級聯(lián)獲取 indexes的統(tǒng)計信息
end;
1.4 查看表占用空間大小
select segment_name,segment_type,bytes/1024/1024 from dba_segments ds
where ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
JAX_T11 TABLE 17
IDX_JAX_T11_01 INDEX 9
這里我們可以看到,表占空間17M,索引占空間9M;
表空間占用明細
SELECT table_name,tablespace_name,
num_rows, -- 記錄行數(shù)
avg_row_len, --平均行長度
blocks,
avg_space,
empty_blocks
from user_tables ut
where ut.table_name = 'JAX_T11'
TABLE_NAME TABLESPACE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS AVG_SPACE EMPTY_BLOCKS
JAX_T11 DRP_DATA 160000 100 2146 0 0
索引空間占用明細
SELECT index_name,table_name,leaf_blocks,distinct_keys,num_rows
from user_indexes ut
where ut.index_name = upper('idx_jax_t11_01')
INDEX_NAME TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS
IDX_JAX_T11_01 JAX_T11 1036 9832 160000
二,刪除90%的記錄后的空間占用
2.1 刪除90%的記錄
delete from jax_t11
where rowid in (select r1
from (select rowid r1, mod(rownum, 100) r2 from jax_t11) t
where r2 = 90);
commit;
2.2 分析表及索引
begin
dbms_stats.gather_table_stats
( ownname = user, -- 表的擁有者
tabname = upper('jax_t11'), -- 表名稱
method_opt = 'for all indexed columns size 1', -- 獲得所有索引列的柱狀圖
cascade = TRUE ); -- 級聯(lián)獲取 indexes的統(tǒng)計信息
end;
2.3 查看表占用空間大小
select segment_name,segment_type,bytes/1024/1024 from dba_segments ds
where ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
JAX_T11 TABLE 17
IDX_JAX_T11_01 INDEX 9
這里我們可以看到,表占空間17M,索引占空間9M;與刪除數(shù)據(jù)前相比,沒有任何改變
表空間占用明細
SELECT table_name,tablespace_name,
num_rows, -- 記錄行數(shù)
avg_row_len, --平均行長度
blocks,
avg_space,
empty_blocks
from user_tables ut
where ut.table_name = 'JAX_T11'
TABLE_NAME TABLESPACE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS AVG_SPACE EMPTY_BLOCKS
JAX_T11 DRP_DATA 14400 100 2146 0 0
索引空間占用明細
SELECT index_name,table_name,leaf_blocks,distinct_keys,num_rows
from user_indexes ut
where ut.index_name = upper('idx_jax_t11_01')
INDEX_NAME TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS
IDX_JAX_T11_01 JAX_T11 998 7654 14400
三,move table rebuild index
3.1 刪除90%的記錄
alter table jax_t11 move;
alter index idx_jax_t11_01 rebuild;
3.2 分析表及索引
begin
dbms_stats.gather_table_stats
( ownname = user, -- 表的擁有者
tabname = upper('jax_t11'), -- 表名稱
method_opt = 'for all indexed columns size 1', -- 獲得所有索引列的柱狀圖
cascade = TRUE ); -- 級聯(lián)獲取 indexes的統(tǒng)計信息
end;
3.3 查看表占用空間大小
select segment_name,segment_type,bytes/1024/1024 from dba_segments ds
where ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));
SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
JAX_T11 TABLE 2
IDX_JAX_T11_01 INDEX 0.8125
這里我們可以看到,表占空間2M,索引占空間0.8125M;與刪除數(shù)據(jù)前相比,該回收的空間已經(jīng)回收完畢
當前文章:oracle如何重構(gòu)表 oracle表重建
路徑分享:http://muchs.cn/article4/hjdeie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站策劃、建站公司、企業(yè)網(wǎng)站制作、App設(shè)計、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)