重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
reorg 通过重构行来消除“碎片”数据并压缩信息,对表进行重组。 还有一个功能就是可以将表中的数据按照某个索引关键字的顺序排列,从而可以减少某些查询i/o数量。 当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能,值得注意的是,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起 系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG操作。
创新互联主要从事成都网站制作、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务城关,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
执行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
1、在数据库服务器的开始菜单中找到Datebase Configuration Assistant。
2、在创建画面第一步选择:创建新数据库,点击下一步。
3、根据需求选择自己的数据库类型(一般默认)后,跳转到全局数据库名这个画面时,重点来了:新建数据库名称不能和已经存在的任何一个数据库名称相同。
4、在管理帐户密码界面,可以与别的数据库管理帐户密码相同也可以不同,需注意的是,Oracle数据库默认是区分密码大小写的。
5、跳转到Oracle内存分配大小页面,这里建议将Oracle内存调整为物理主机内存的70%。
6、点击完成后,等待数据库创建完成。
7、数据库创建完成后,用sqlplus 语句连接数据库,在同一服务器上建立多个Oracle数据库操作完成。
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;与删除数据前相比,该回收的空间已经回收完毕
先把拟清理表空间上的对象导出,并在其他表空间上创建完成,并确保不影响应用;删除和拟清理表空间相关的用户、表空间上对象、删除表空间。
解释起来比较麻烦,去翻翻数据碎片的定义吧。
以后可以定期使用move或者shrink命令重组表。