189 8069 5689

oracle如何重构表 oracle表重建

oracle如何将有相同数据的两张表整合为一张表

给你个思路,先修改B表的表结构,增加A表中的两个列,然后更新B表,用来将A表中的数据插入到B表中对应的列。

成都创新互联专注于岐山企业网站建设,响应式网站,商城系统网站开发。岐山网站建设公司,为岐山等地区提供建站服务。全流程定制开发,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

oracle数据库,结果集拆分重构。

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第一条存值,后续为空

case when levels.column_value 1 then null else t.rn end as new_rn,  

t.rn,

levels.column_value as sub_order,  

--4可以通过参数传递

trim(regexp_substr(t.a, '(.{1,4})', 1, levels.column_value))  as a,  

t.b,

--c第一条存值,后续为空

case when levels.column_value 1 then null else t.c end as c ,

t.d

from sleest t,

table(

cast(

multiset(

--4可以通过参数传递

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

构造临时数据:

根据需求参数4进行划分:

参考stackover上的一个解决方案改的,原文地址如下:

oracle如何重建表的id列

create sequence seq_id start with 1000 increment by 1 ;

update t set id=seq_id.nextval ;

1000w可能会稍微慢点,正常,看你的存储如何了,

Oracle 中对于大表是怎样更改表结构并且在

修改表名:

alter table 表名 rename to 新名

添加字段:

alter table 表名 add 字段名 字段类型

删除字段:

alter table 表名 drop column 字段名

修改字段:

alter table 表名 rename column 原字段名 to 新名;

修改字段类型(前提:表中无数据)

alter table 表名 modify 字段名 新类型;

例如:String deleteColumn="alter table t_user drop column sname";

ORACLE 10G EXPRESS,REORG怎么操作,请指导详细操作步骤,谢谢!

reorg 通过重构行来消除“碎片”数据并压缩信息,对表进行重组。 还有一个功能就是可以将表中的数据按照某个索引关键字的顺序排列,从而可以减少某些查询i/o数量。 当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能,值得注意的是,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起 系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG操作。

执行REORG可以考虑分为表上有索引和没有索引两种情况:

1) 如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF

SQL:reorg table db2inst1.staff index db2inst1.istaff use tempspace1

建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会在表所在表空间中原地执行.如果表上有多个索引,INDEX参数值请使用最为重要的索引名.

2)表上没有索引:

reorg table db2inst1.staff use tempspace1

reorg table sysibm.systables use tempspace1

如何对oracle进行 REORG?

alter table tablename move [tablespace tablespacename];

delete数据不会回收已经分配出去的block(也就是delete前后你查看user_segments中的信息不会有改动)。

但这时你对表执行analyze后查看dba_tables表的话会发现empty_block数目变大或者avg_space数据变小。

如果你希望减少该table占用的实际block数目,

你需要使用move操作将table重建,oracle才会重新分配block,这时table上的索引会失效,需要rebuild。

一,创建测试环境

1.1 创建测试表,为其插入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 创建索引

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 ); -- 级联获取 indexes的统计信息

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, -- 记录行数

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 ); -- 级联获取 indexes的统计信息

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;与删除数据前相比,没有任何改变

表空间占用明细

SELECT table_name,tablespace_name,

num_rows, -- 记录行数

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 ); -- 级联获取 indexes的统计信息

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;与删除数据前相比,该回收的空间已经回收完毕


名称栏目:oracle如何重构表 oracle表重建
分享网址:http://cdxtjz.cn/article/hjdeie.html

其他资讯