非分区表的重组

项目的数据过多的占用系统表空间后会造成系统的效率降低,影响系统 的性能。如果数据库对象占用系统表空间过大就需要移动该对象到指定的项目数据表空间。可以在不运行emp或者imp程序的情况下移动一个非分区表。移动非分区表时可以修改表的存储参数,这被用于移动一个表从一个表空间到另一个表空间或者重组表以消除数据行的迁移。

当一个非分区表被重组时表的结构被保存但是该表上的所有的索引都失效必须重建索引,尤其是primary key index。

一、移动占用system表空间容量过大的数据库对象(表段)

1、排查占用system表空间的数据库对象时首先确定当期登录用户拥有的数据库对象所存储的表空间是否是system表空间。在数据库中占用磁盘空间的最直接对象就是segment,因此判断数据库占用磁盘空间的大小实际上就是判断存储该数据库对象的segment中包含的extents的个数,extents是oracle分配磁盘空间的最小单位。oracel为避免使用数据库分配空间过程中频繁的调用递归算法降低系统的 效率,故设置分配磁盘空间的最小单位是extents。dba_segments数据字典中存储了segment的分配信息。

select segment_name,segment_type,tablespace_name from dba_segments where owner=‘USER_NAME‘;

判断当前登录用户拥有的DB对象存储的表空间是否是system

一般查询出的segment对象的type为table或者index最为常见

2、如果要移动表必须确定该表上的所有的索引,包含主键的唯一索引和建立在其他列上的索引

select index_name,table_name,tablespace_name,status from dba_indexes where owner=‘USER_NAME‘ and table_name=‘TARGET_TABLE_NAME‘;

获得目标表上的所有索引,判断其tablespace和status。

3、从系统表空间中移动目标表到指定的项目表空间

  alter table schema.table_name

    move tablespace tablespace_name

4、确定目标表已经移动到目标表空间

select segment_name,segment_type,tablespace_name from dba_segments where owner=‘USER_NAME‘;

确定移动后目标表是否有效

select object_name,object_type,status from dba_objects where owner=‘USERNAME‘;

移动目标表后建立在该目标表上的索引可能会失效status变为unused

5、从dba_indexes中查看索引的状态是否有效

select index_name,table_name,tablespace_name,status from dba_indexes where owner=‘USER_NAME‘ and table_name=‘TARGET_TABLE_NAME‘;

status状态变为unused

6、重建index并且移动index到指定的项目表空间

alter index schema.index_name  rebuild

  tablespace tablespace_name;

7、确定移动后的index是否有效

select index_name,table_name,tablespace_name,status from dba_indexes where table_name=‘TARGET_TABLE_NAME‘ and owner=‘USERNAME‘;

注:index关联到表,dba_indexes中关联到目标表的index,查询时可以由table关联需要移动的index。移动目标表然后移动该表上建立的索引完成移动system表空间中占据空间较大的DB对象。

非分区表的重组,布布扣,bubuko.com

时间: 2024-09-27 16:34:44

非分区表的重组的相关文章

Oracle 12.2新特性----在线把非分区表转为分区表

在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1.建好分区表然后insert into select 把数据插入到分区表中:2.使用在线重定义(DBMS_REDEFINITION)的方法.它们的币是:第一种方法,如果对表有频繁的DML操作,尤其是update操作,就需要停业务来做转换.第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错. Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表,语法如下: ALT

如何确定非分区表高水位虚高

如何确定非分区表高水位虚高: 一般认为分配给表使用的数据块空间远大于表实际占用存储空间时,我们就认为表的高水位虚高,涉及该表的查询sql存在不必要的消耗,需要进行优化. 通过比较数据占用和分配数据块的空间比对来确定哪些表的高水位虚高: sys用户执行(如果数据库支持statistics_level配置,一般9.2之后都支持): SQL>exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO(); 再执行: SELECT a.owner || '.' || a

Oracle 12C 新特性之move (非分区表)table online

以前版本中move table不能够online, move 会引rowid改变使对应的索引失效. 12c 中 alter table move online不会对新事务阻塞同时会自动的维护索引的有效性. -- 创建实验表SQL> create table andy_move (id int,name varchar2(10));Table created.-- 插入数据SQL> beginfor i in 1 .. 39 loopinsert into andy_move values(i,

MySQL 分区表原理及数据备份转移实战

1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 2.分区表优点 1)分区表更容易维护.对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有

MySQL分区表姿势

大部分内容整理自姜承尧的innodb存储引擎2学习笔记. 分区: 分区的功能不是在存储引擎层实现的.因此不只是InnoDB才支持分区.MyISAM.NDB都支持分区操作. 分区的过程是将一个表或者索引分解为多个更小.更可管理的部分.从逻辑上将,只有一个表或者索引,但是在物理上这个表或索引可能由数十个物理分区组成. 每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理. MySQL只支持水平分区,不支持垂直分区. 水平分区:将同一表中不同行的记录分配到不同的物理文件中. 垂

ORACLE 分区表简介

参考链接:http://blog.csdn.net/ziwen00/article/details/9158725ORACLE-分区表 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. 6.表的分区做过改变后索引问题 7.将一个非分区表转换为分区表 (1) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Hash(哈希)分区 •       List(列表)分区 •       以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区

oracle 分区表

一. 分区表理论知识 Oracle提供了分区技术以支持VLDB(Very Large DataBase).分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中.分区完全对应用透明. Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中.查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询. When to Partition a Table什么时候需要分区表,官网的2个建议如下: (1)Tabl

Hive中如何快速的复制一张分区表(包括数据)

转自:http://lxw1234.com/archives/2015/09/484.htm 关键字:Hive 复制表 Hive中有时候会遇到复制表的需求,复制表指的是复制表结构和数据. 如果是针对非分区表,那很简单,可以使用CREATE TABLE new_table AS SELECT * FROM old_table; 那么如果是分区表呢? 首先想到的办法可能是: 先创建一张和old_table结构相同的new_table,包括分区:可以使用CREATE TABLE new_table L