将Oracle数据库的普通表转换成分区表
转换分区表类型

转换分区表类型清除保留扇区转换分区表类型分区表错误检查与更正本软件支持传统的MBR分区表类型及较新的GUID分区表类型。
必要时可通过本软件在这两种分区表类型之间进行无损转换。
转换时不会破坏文件数据,但是对于不支持GUID分区表格式的操作系统,将无法访问使用GUID分区表的磁盘分区及其文件!一、转换分区表类型为GUID格式本功能用于将磁盘分区表类型转换为GUID。
转换前磁盘的首尾部必须要有转换到GUID分区所必须的空闲扇区(几十个扇区即可)。
否则无法转换。
请确认转换后使用该磁盘的操作系统支持GUID分区表格式,否则转换后该磁盘分区将无法访问!1. 要执行该操作,选择要转换的磁盘后,点击菜单“磁盘- 转换分区表类型为GUID格式”项。
2. 点击“保存更改”按钮保存分区表,让转换实际生效。
二、转换分区表类型为MBR格式本功能用于将分区表类型转换回传统的MBR格式。
由于MBR分区表有一定的限制(如主分区数目不能超过四个等),这种转换有一定的条件限制。
因此在转换时,如果分区数目多于四个,本软件将首先尝试将后部的分区逐一转换为逻辑分区。
如果无法转换到逻辑分区(一般是由于分区前没有转换到逻辑分区的空闲扇区),分区表类型转换将失败。
1. 要执行该操作,选择要转换的磁盘后,点击菜单“磁盘- 转换分区表类型为MBR格式”项。
2. 程序弹出如下提示。
如果磁盘容量超过2TB,转换为MBR格式后,超过2TB的部分容量将无法使用。
另外如果GPT磁盘上安装有基于EFI架构的操作系统,转换到MBR类型后该操作系统将无法启动。
确认无误后点击“确定”按钮开始转换。
3. 点击“保存更改”按钮保存分区表,让转换实际生效。
Oracle 分区表的优点

ORACLE 表分区表分区的好处和事处理表分区描述表分区(partition):表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。
而这种分区对于应用来说是透明的。
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。
通常,分区可以使某些查询以及维护操作的性能大大提高。
此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。
每个分区都是一个独立的段(SEGMENT),可以存放到相同(不同)的表空间中。
从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。
(对于高效率查询是有影响,主要差别是对某一分区数据时行查询时和对整体数据进行查询)表分区的好处通过对表进行分区,可以获得以下的好处:1)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;2)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;3)均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;4)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
分区表事务操作的时候,指定了分区,系统在执行的时候则只操作该分区的记录,提高了数据处理的速度。
不要指定分区直接操作数据也是可以的。
在分区表上建索引及多索引的使用和非分区表一样。
此外,因为在维护分区的时候可能对分区的索引会产生一定的影响,可能需要在维护之后重建索引,相关内容请参考分区表索引部分的文档缺点分区表相关:已经存在的表没有方法可以直接转化为分区表。
oracle大表改造分区表的步骤

oracle大表改造分区表的步骤将Oracle大表改造为分区表的步骤如下:1. 数据预处理:首先,对大表进行数据分析,确定适合的分区列(分区键),例如日期、地域等。
然后,对数据进行预处理,确保数据符合分区键要求,如格式统一、排序等。
2. 创建分区表:使用CREATE TABLE语句创建分区表,指定分区键和分区策略。
分区策略可以是范围分区、列表分区或哈希分区等。
同时,也可以定义分区索引和本地分区索引。
3. 迁移数据:将大表中的数据迁移到分区表中,可以使用INSERT INTO SELECT语句或者数据泵工具(如expdp和impdp命令)进行数据迁移。
确保迁移的数据符合分区键和分区策略要求。
4. 索引重建:根据分区表的分区信息,重新创建分区索引和本地分区索引。
可以使用ALTER TABLE语句添加分区索引,也可以使用CREATE INDEX语句重新创建索引。
5. 测试验证:对分区表进行测试和验证,包括数据查询、插入、更新和删除等操作,确保分区表的性能和功能正常。
6. 调优优化:根据实际需求和性能要求,进行分区表的调优和优化。
可以使用Oracle提供的分区相关功能,如局部分区索引、分区裁剪、分区交换等,以提升查询和维护效率。
7. 应用升级:在应用层面进行相应的升级,确保应用程序能够正确地操作和利用分区表,如修改SQL语句、更新存储过程等。
8. 监控维护:在生产环境中,对分区表进行监控和维护,包括定期备份、压缩分区、重新构建索引等,以保证分区表的稳定性和性能。
总结:将Oracle大表改造为分区表的步骤主要包括数据预处理、创建分区表、迁移数据、索引重建、测试验证、调优优化、应用升级和监控维护等。
这些步骤可以根据实际情况进行调整和扩展,以满足具体的业务需求和性能要求。
【Oracle】truncate分区表

no rows selected
The End!
1 row created.
SQL> insert into t_partition_range values (2,'lisi');
1 row created.
SQL> insert intoห้องสมุดไป่ตู้t_partition_range values (3,'wangwu');
1 row created.
2 partition by range(id)( 3 partition t_range_p1 values less than (10), 4 partition t_range_p2 values less than (20), 5 partition t_range_p3 values less than (30), 6 partition t_range_pmax values less than (maxvalue) 7 );
SQL> commit;
Commit complete.
SQL> select * from t_partition_range partition (t_range_p1);
ID NAME ---------- -------------------------------------------------1 zhangsan 2 lisi 3 wangwu
oracle普通表转化为分区表的方法

一、引言在数据库管理系统中,分区表是一种将表中数据按照特定规则分割存储的技术,可以提高数据的查询和管理效率。
而对于现有的普通表,如何将其转化为分区表是数据库管理员经常面临的问题之一。
在Oracle数据库中,有多种方法可以实现将普通表转化为分区表,本文将对其中的一些常用方法进行介绍和分析。
二、创建分区表的基本步骤1. 设计分区键:分区键是决定表数据如何分割存储的关键因素,可以是按照时间、地区、业务类型等规则进行分割。
在设计分区键时,需要考虑到数据的查询频率、增长趋势以及分区之间的平衡性。
2. 创建分区表:通过创建新的表结构,并按照设计好的分区键进行分割,可以将普通表转化为分区表。
在创建分区表时,需要考虑到分区类型(范围分区、列表分区、哈希分区等)、分区键的数据类型和约束条件等因素。
3. 数据迁移:将原有普通表中的数据迁移至新创建的分区表中,在数据迁移过程中需要考虑到数据的一致性和完整性,可以通过Oracle内置的数据迁移工具或者自定义的数据迁移脚本来实现。
4. 更新应用程序:由于原有的普通表与新创建的分区表结构不同,需要对应用程序进行相应的更新和调整,以适配新的数据存储结构。
三、利用ALTER TABLE语句进行分区表转化1. 使用ALTER TABLE ... MOVE PARTITION语句:该语句可以将整个分区的数据移动至新创建的分区表中,并可以同时对数据进行重分布和整理。
这种方法适用于数据量较小的表,操作简单方便。
2. 使用ALTER TABLE ... SPLIT PARTITION语句:如果原有的普通表结构已经满足分区表的要求,可以通过该语句将原有表中的数据按照分区键进行分割,并将其转化为分区表。
四、利用DBMS_REDEFINITION包进行分区表转化1. 使用DBMS_REDEFINITION.START_REDEF_TABLE过程:通过该过程可以启动对指定表的在线重定义操作,包括表结构、数据进行迁移等。
Oracle的临时表、分区表、分区索引

Oracle的临时表一、表的种类1:永久表:非私有数据,需要DML锁。
2:临时表:临时表的定义对所有会话都是可见的,处理事务或会话期存在的私有数据,不需要DML锁,对于临时表的DML语句不生成重做日志,临时表占用临时表空间,临时表的数据是自动删除的,在临时表上建的索引也是临时的。
二、临时表的种类1:事物型临时表:在事务期间数据存在,事务结束后数据被自动删除。
2:会话型临时表:在会话期间数据存在,会话结束后数据被自动删除。
三、临时表的限制1:不能分区,不能是索引组织表或簇。
2:不能指定关于临时表的外键约束。
3:不支持并行DML或并行查询。
4:不支持分布式事务处理。
5:不能指定段存储语句、嵌套表存储语句或并行语句四、建立临时表的语法1:建立关系表2:建立对象表3:并行语句Oracle的分区表一、什么是分区表Oracle可以将大表或索引分成若干个更小更方便管理的部分,每一部分称为一个分区,这样的表称为分区表。
SQL语句使用分区表比全表或全表索引能提供更好的访问和处理数据。
下图是按周所建分区表示例。
二、使用分区表的限制1:不能分割是簇一部分的表。
2:不能分割含有LONG或LONG RAW列的表。
3:索引组织表IOT不能进行范围分区。
**采用基于规则的优化器时,有会从分区表中受益!三、分区方法1:范围分区(更适合历史数据库)—Oracle8从惟一可用的分区类型按照列的列表的范围分割表;如果是索引组织表,则列的列表就必须是索引组织表主键的子集。
分区关键列的限制:列列表中的列可以是任何一种内置的数据类型,ROWID、LONG、LOB或者TIMESTAMP WITH TIME ZONE除外。
关键字MAXVALUE比任何值都高(含NULL)。
2:散列分区--Oracle8i可用的分区类型指定这个表是按哈希算法分区的,分区的数目应为2的幂。
1)单独散列分区(individual_hash_partitions)及其限制使用子名按照名字指定单个分区,分区名可以匆略。
oracle按时间创建分区表

oracle 按时间创建分区表首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。
当表的大小过G 的时候可以考虑进行表分区,提高查询效率,均衡IO 。
oracle 分区表是oracle 数据库提供的一种表分区的实现形式。
表进行分区后,逻辑上仍然是一张表,原来的查询SQL 同样生效,同时可以采用使用分区查询来优化SQL 查询效率,不至于每次都扫描整个表一、分区表基本操作1、按时间分区表创建:1 2 3 4 5 6 7 8 9 10 11 create table t_test (pk_id number(30) not null,add_date_time DATE,constraintPK_T_TEST primary key (pk_id))PARTITION BY RANGE (add_date_time)(PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS)其中add_date_time 为分区字段,每一年一个分区。
插入100W 数据1 2 3 4 5 6 7 declarei int := 1;yearVARCHAR2(20);beginloopyear := CASEmod(i, 3)WHEN 0 THEN8 9 10 11 12 13 14 15 16 17 18 '2012-01-14 12:00:00'WHEN 1 THEN'2013-01-14 12:00:00'ELSE'2014-01-14 12:00:00'END;insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss'));exit when i= 1000000;i := i + 1;end loop;end;查看分区表的分区的详细信息1 Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';2、分区表修改2.1增加一个分区分两种情况:1.没有maxvalue 分区。
oracle索引和表分区

聚集索引
B树聚集索引
与索引组织表索引几乎相同索引页结点都对应着数据
Hash聚集索引
使用HASH聚集索引 如果数据都存储在同一个数据库块上,并且将 HASH索引作为WHERE子句中的确切匹配,就可以通过执行HASH函数和 一个I/O来访问数据 HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点 。 低估了集群键的不同值的数字可能会造成集群的冲突(两个集群的键 值拥有相同的HASH值)。这种冲突是非常消耗资源的。冲 突会造成用 来存储额外行的缓冲溢出,然后造成额外的I/O。如果不同HASH值的 数目已经被低估,您就必须在重建这个集群之后改变这个值。ALTER CLUSTER命令不能改变HASH键的数目。 HASH集群还可能浪费空间。如果无法确定需要多少空间来维护某个集 群键上的所有行,就可能造成空间的浪费。如果不能为集群的未来增 长分配好附加的空间,HASH集群可能就不是最好的选择。
SQL> CREATE TABLE org_tab ( id NUMBER(4) PRIMARY KEY, name VARCHAR2(20) ) ORGANIZATION INDEX;
索引组织表(IOT)
普通表与索引组织表的比较 普通表 索引组织表
主键唯一标识一行。主键是 Rowid唯一标识一行,主键是可选的 必须的伪列ROWID的逻辑 伪列ROWID的物理ID允许构建辅助索引 rowid允许构建辅助索引 通过物理rowid访问 通过逻辑rowid访问
顺序扫描返回所有行 可以和其他表保存在聚集中
全索引扫描返回所有行 不能保存在聚集中
不支持分区可以包含LOB列, 但不能包含LONG列
可以包含一个类型为LONG的列和多个 LOB类型的列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统。
Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了。
而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作。
在线重定义表具有以下功能:修改表的存储参数;可以将表转移到其他表空间;增加并行查询选项;增加或删除分区;重建表以减少碎片;将堆表改为索引组织表或相反的操作;增加或删除一个列。
调用DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色,除此之外,还需要CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE和SELECT ANY TABLE的权限。
在线重定义表的步骤如下:1.选择一种重定义方法:存在两种重定义方法,一种是基于主键、另一种是基于ROWID。
ROWID的方式不能用于索引组织表,而且重定义后会存在隐藏列M_ROW$$。
默认采用主键的方式。
2.调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,如果表不满足重定义的条件,将会报错并给出原因。
3.在用一个方案中建立一个空的中间表,根据重定义后你期望得到的结构建立中间表。
比如:采用分区表,增加了COLUMN等。
4.调用DBMS_REDEFINITION.START_REDEF_TABLE()过程,并提供下列参数:被重定义的表的名称、中间表的名称、列的映射规则、重定义方法。
如果映射方法没有提供,则认为所有包括在中间表中的列用于表的重定义。
如果给出了映射方法,则只考虑映射方法中给出的列。
如果没有给出重定义方法,则认为使用主键方式。
5.在中间表上建立触发器、索引和约束,并进行相应的授权。
任何包含中间表的完整性约束应将状态置为disabled。
当重定义完成时,中间表上建立的触发器、索引、约束和授权将替换重定义表上的触发器、索引、约束和授权。
中间表上disabled的约束将在重定义表上enable。
6.(可选)如果在执行DBMS_REDEFINITION.START_REDEF_TABLE()过程和执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()过程直接在重定义表上执行了大量的DML操作,那么可以选择执行一次或多次的SYNC_INTERIM_TABLE()过程,以减少最后一步执行FINISH_REDEF_TABLE()过程时的锁定时间。
7.执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()过程完成表的重定义。
这个过程中,原始表会被独占模式锁定一小段时间,具体时间和表的数据量有关。
执行完FINISH_REDEF_TABLE()过程后,原始表重定义后具有了中间表的属性、索引、约束、授权和触发器。
中间表上disabled的约束在原始表上处于enabled状态。
8.(可选)可以重命名索引、触发器和约束。
对于采用了ROWID方式重定义的表,包括了一个隐含列M_ROW$$。
推荐使用下列语句经隐含列置为UNUSED状态或删除。
ALTER TABLE TABLE_NAME SET UNUSED (M_ROW$$);ALTER TABLE TABLE_NAME DROP UNUSED COLUMNS;下面是进行重定义操作后的结果:原始表根据中间表的属性和特性进行重定义;START_REDEF_TABLE()和FINISH_REDEF_TABLE()操作之间在中间表上建立的触发器、索引、约束和授权,现在定义在原始表上。
中间表上disabled的约束在原始表上处于enabled状态。
原始表上定义的触发器、索引、约束和授权建立在中间表上,并会在删除中间表时删除。
原始表上原来enabled状态的索引,建立在中间表上,并处于disabled状态。
任何定义在原始表上的存储过程和游标都会变为INVALID,当下次调用时后自动进行编译。
如果执行过程中出现错误或者人为选择退出的话,可以执行DBMS_REDEFINITION.ABORT_REDEF_TABLE()过程。
其中UNAME 参数是指用户;Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。
方法一:利用原表重建分区表步骤:SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);表已创建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;已创建6264行。
SQL> COMMIT;提交完成。
SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),5 PARTITION P4 VALUES LESS THAN (MAXVALUE))6 AS SELECT ID, TIME FROM T;表已创建。
SQL> RENAME T TO T_OLD;表已重命名。
SQL> RENAME T_NEW TO T;表已重命名。
SQL> SELECT COUNT(*) FROM T;COUNT(*)----------6264SQL> SELECT COUNT(*) FROM T PARTITION (P1);COUNT(*)----------SQL> SELECT COUNT(*) FROM T PARTITION (P2);COUNT(*)----------6246SQL> SELECT COUNT(*) FROM T PARTITION (P3);COUNT(*)----------18优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。
不足:对于数据的一致性方面还需要额外的考虑。
由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。
另外在执行两个RENAME语句之间执行的对T的访问会失败。
适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。
方法二:使用交换分区的方法步骤:SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);表已创建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;已创建6264行。
SQL> COMMIT;提交完成。
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),3 PARTITION P2 VALUES LESS THAN (MAXVALUE));表已创建。
SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;表已更改。
SQL> RENAME T TO T_OLD;表已重命名。
SQL> RENAME T_NEW TO T;表已重命名。
SQL> SELECT COUNT(*) FROM T;COUNT(*)----------6264优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。
如果对数据在分区中的分布没有进一步要求的话,实现比较简单。
在执行完RENAME操作后,可以检查T_OLD 中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。
不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。
如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。
适用于包含大数据量的表转到分区表中的一个分区的操作。
应尽量在闲时进行操作。
方法三:Oracle9i以上版本,利用在线重定义功能步骤:SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);表已创建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;已创建6264行。
SQL> COMMIT;提交完成。
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER‟, 'T',DBMS_REDEFINITION.CONS_USE_PK);PL/SQL 过程已成功完成。
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),5 PARTITION P4 VALUES LESS THAN (MAXVALUE));表已创建。