广告
返回顶部
首页 > 资讯 > 数据库 >将非分区表转化成分区表
  • 373
分享到

将非分区表转化成分区表

化成成分 2022-10-18 08:10:10 373人浏览 泡泡鱼
摘要

将非分区表转化成分区表几种实现方式1、insert into 分区表 select * from 非分区表sql> select * from ttpart;  &nbs

将非分区表转化成分区表几种实现方式

1、insert into 分区表 select * from 非分区表

sql> select * from ttpart;


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;


SQL> insert into tt_part select * from ttpart;


4 rows created.


SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46


SQL>  select * from tt_part partition(p_ttpart01);


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


2、expdp/impdp


SQL> select * from tttt;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;

[oracle@orcl impdp]$ expdp lineqi/lineqi directory=impdp_dir dumpfile=lineqi_tttt.dmp tables=\(TTTT\)

[oracle@orcl impdp]$ impdp lineqi/lineqi directory=impdp_dir dumpfile=lineqi_tttt.dmp REMAP_TABLE=lineqi.tttt:lineqi:tt_part TABLE_EXISTS_ACTION=append;

SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

SQL>  select * from tt_part partition(p_ttpart01);


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06


SQL> select * from tt_part partition(p_ttpart02);


        ID V_DATE

---------- -------------------

         1 2016-09-10 14:23:55


3、分区交换技术


SQL> select * from tttt;


        ID V_DATE

---------- -------------------

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

         1 2016-09-10 14:23:55

         1 2016-09-11 14:23:46

create table tt_part(id number,v_date date)

partition by range(v_Date)

(

 partition p_ttpart01 values less than (to_date('2016-09-10 00:00:00','yyyy-mm-dd HH24:mi:ss'))  tablespace test,

  partition p_ttpart02 values less than (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test,

 partition p_ttpart03 values less than (to_date('2016-09-12 00:00:00','yyyy-mm-dd HH24:mi:ss')) tablespace test

)

;

SQL> select table_name,partition_name from user_tab_partitions where table_name='TT_PART';


TABLE_NAME                 PARTITION_NAME

-------------------- -----------------------

TT_PART                      P_TTPART01

TT_PART                      P_TTPART02

TT_PART                      P_TTPART03



SQL> alter table tt_part exchange partition P_TTPART03  with table tttt;

alter table tt_part exchange partition P_TTPART03  with table tttt

                                                              *

ERROR at line 1:

ORA-14099: all rows in table do not qualify for specified partition


上面交换时报错,是因为非分区表中的数据不满足分区表中存放条件,这时可以加上without validation选项进行交换。但数据在分区表中的存放与进行分区时的条件不符合。

SQL> alter table tt_part exchange partition P_TTPART03  with table tttt without validation;


Table altered.


SQL> select * from tt_part;


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

SQL> select * from tt_part partition(P_TTPART02);


no rows selected

从下面可以看出所有的记录都存放在P_TTPART03

SQL>  select * from tt_part partition(P_TTPART03);


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46

         1 2016-09-10 14:23:55

         1 2016-09-09 14:24:01

         1 2016-09-08 14:24:06

下面查询非分区表,则没有任何记录。

SQL> select * from tttt;


no rows selected

分区交换技术其实是修改数据字典来完成操作的,Global索引或涉及到数据改动了的global索引分区会被置为unusable,除非附加update indexes子句。



4、在线重定义技术


给用户授权

SQL>GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE, DROP ANY TABLE, LOCK ANY TABLE  ,SELECT ANY TABLE,CREATE ANY INDEX,CREATE ANY TRIGGER TO lineqi;


SQL> GRANT EXECUTE_CATALOG_ROLE TO lineqi;



SQL> exec dbms_redefinition.can_redef_table('LINEQI','TTTT',dbms_redefinition.cons_use_rowid);

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART');

 

begin dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART'); end;

 

ORA-12089: 不能联机重新定义无主键的表 "LINEQI"."TTTT"

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 56

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1498

ORA-06512: 在 line 2

通过rowid来重定义表失败

alter table tttt add constraint pk_id primary key (id)

 

SQL> exec dbms_redefinition.start_redef_table('LINEQI','TTTT','TT_PART'); 将TTTT中的数据插入到分区表tt_part表中

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.sync_interim_table('LINEQI','TTTT','TT_PART');同步将TTTT中的数据插入到分区表tt_part表时所产生的新数据

 

PL/SQL procedure successfully completed

 

SQL> exec dbms_redefinition.finish_redef_table('LINEQI','TTTT','TT_PART');结束同步


 

PL/SQL procedure successfully completed

说明:TESTRE是要进行重定义的表,TTTT是与TESTRE相同表结构的分区表

同步结束之前的情况

select * from user_objects t where t.OBJECT_NAME in ('TTTT','TESTRE')

OBJECT_NAME      SUBOBJECT_NAME  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE 

TESTRE 89319   89319 TABLE

TTTT 89232 T TABLE

TTTT P_TTPART01 89233 89320 TABLE PARTITION

TTTT P_TTPART02 89234 89321 TABLE PARTITION

TTTT P_TTPART03 89235 89322 TABLE PARTITION


同步结束之后的情况

TESTRE 89232 TABLE

TESTRE P_TTPART01 89233 89320 TABLE PARTITION

TESTRE P_TTPART02 89234 89321 TABLE PARTITION

TESTRE P_TTPART03 89235 89322 TABLE PARTITION

TTTT 89319 89319 TABLE


其实是交换相应对象的object_id,data_object_id


--优点:

--保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。

--只在切换的瞬间表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。

--而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

--

--不足:实现上比上面两种略显复杂,适用于各种情况。

--然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制:

--你必须有足以维护两份表格拷贝的空间。   

--你不能更改主键栏。   

--表格必须有主键。   

--必须在同一个大纲中进行表格重定义。   

--在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。   

--表格不能包含LONG、BFILE以及用户类型(UDT)。   

--不能重定义链表(clustered tables)。   

--不能在SYS和SYSTEM大纲中重定义表格。   

--不能用具体化视图日志(materialized VIEW logs)来重定义表格;不能重定义含有具体化视图的表格。   

--不能在重定义过程中进行横向分集(horizontal subsetting)



补充分区合并


SQL> alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart02;

alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart02

                                    *

ERROR at line 1:

ORA-14275: cannot reuse lower-bound partition as resulting partition



SQL> alter table testre merge partitions p_ttpart02,p_ttpart03 into partition p_ttpart03;


Table altered.

SQL> select table_name,partition_name from user_tab_partitions where table_name='TESTRE';

TABLE_NAME                  PARTITION_NAME

--------------------- ---------------------

TESTRE                      P_TTPART01

TESTRE                      P_TTPART03


分裂分区


SQL> alter table testre split partition P_TTPART03 at (to_date('2016-09-11 00:00:00','yyyy-mm-dd HH24:mi:ss')) into (partition p_ttpart02 tablespace 


test,partition p_ttpart03);


Table altered.

上面partition p_ttpart02 tablespace test并没有之后创建好,而是在split时创建的。之前在做split时是手动把partition p_ttpart02分区表建立好的,结果做split直接报


下面错误。

ORA-14080: partition cannot be split along the specified high bound


SQL> col table_name for a35

SQL> col partition_name for a40

SQL> select table_name,partition_name from user_tab_partitions where table_name='TESTRE';


TABLE_NAME                          PARTITION_NAME

----------------------------------- ----------------------------------------

TESTRE                              P_TTPART01

TESTRE                              P_TTPART02

TESTRE                              P_TTPART03


SQL> select * from testre partition(p_ttpart03);


        ID V_DATE

---------- -------------------

         1 2016-09-11 14:23:46


SQL>  select * from testre partition(p_ttpart02);


        ID V_DATE

---------- -------------------

         2 2016-09-10 14:23:55

对于某一个分区中有大量数据时,最好在业务空闲时间去做,并且split后记得查询索引状态是否有效


您可能感兴趣的文档:

--结束END--

本文标题: 将非分区表转化成分区表

本文链接: https://www.lsjlt.com/news/44293.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 将非分区表转化成分区表
    将非分区表转化成分区表几种实现方式1、insert into 分区表 select * from 非分区表SQL> select * from ttpart;  &nbs...
    99+
    2022-10-18
    化成 成分
  • Oracle怎么把非分区表转为分区表
    这篇文章主要介绍“Oracle怎么把非分区表转为分区表”,在日常操作中,相信很多人在Oracle怎么把非分区表转为分区表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Orac...
    99+
    2022-10-18
    oracle
  • Oracle 12.2新特性----在线把非分区表转为分区表
    在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1、建好分区表然后insert into select 把数据插入到分区表中;2、使用在线重定义(DBMS_RED...
    99+
    2022-10-18
    oracle convert online
  • Oracle 12.2之后ALTER TABLE .. MODIFY转换非分区表为分区表
    说明 本文将包含如下内容: ORACLE 19.5 测试ALTER TABLE ... MODIFY转换非分区表为分区表 创建测试表 CREATE TABLE TEST_MODIF...
    99+
    2022-10-18
    12.2 之后 alter
  • MySQL普通表如何转换成分区表
    小编给大家分享一下MySQL普通表如何转换成分区表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-18
    mysql
  • MySQL普通表怎么转换成分区表
    本篇内容介绍了“MySQL普通表怎么转换成分区表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!版本:MySQL-5.7.32前言:对于业务繁...
    99+
    2023-06-30
  • windows怎么将MBR分区转换成GPT分区
    本文小编为大家详细介绍“windows怎么将MBR分区转换成GPT分区”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows怎么将MBR分区转换成GPT分区”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。将...
    99+
    2023-07-01
  • SQL中怎么将普通表转换为分区表
    SQL中怎么将普通表转换为分区表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码如下: CREATE TABLE Sale( ...
    99+
    2022-10-18
    sql
  • mysql的普通表怎么转换成分区表
    这篇文章主要讲解了“mysql的普通表怎么转换成分区表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的普通表怎么转换成分区表”吧! ...
    99+
    2022-10-18
    mysql
  • 在线重定义 ?普通表转换成分区表
    --收集表的统计信息 ...
    99+
    2022-10-18
    分区表 在线 定义
  • oracle普通表转化为分区表的方法
    上一篇文章中我们了解了oracle数据与文本导入导出源码示例的相关内容,接下来我们看看,oracle中如何将普通表转化为分区表的方法。 oracle官方建议当表的大小大于2GB的时候就使用分区表进行管理,分...
    99+
    2022-10-18
    oracle 分区表 化为
  • 转:Mysql 分区 分表相关总结
    拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水...
    99+
    2022-10-18
    mysql 分区 分表
  • mysql分区表:日期分区
    mysql分区表:日期分区 1.创建分区表2.查看分区3.添加分区4.存储过程:分区删除与创建5.事件定时6.触发器设计:子表每插入一行,总表获得一行7.创建索引8.添加枚举型字段 1.创建分区表 CREATE TAB...
    99+
    2023-08-21
    mysql 数据库
  • Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法
    一. 分区表理论知识Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。Oracle的分区...
    99+
    2022-10-18
    current example always
  • 数据库中怎么将一个普通表转换为分区表
    这篇文章给大家分享的是有关数据库中怎么将一个普通表转换为分区表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.1  BLOG文档结构图 1.2  ...
    99+
    2022-10-18
    数据库
  • mysql中如何将一个表改为分区表
    这篇文章主要介绍mysql中如何将一个表改为分区表,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql操作将一个表改为分区表:alter table 'table'...
    99+
    2022-10-19
    mysql
  • 普通表转分区表(在线重定义)
    确认表是否可以分区 SQL> BEGIN   2  DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','EM...
    99+
    2022-10-18
    分区表 在线 定义
  • MySql之分区分表
    MySql之分区分表分表的概念分表:将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些表可以分布在同一块磁盘上,也可...
    99+
    2022-10-18
    mysql duyuheng
  • oracle 分区表move和包含分区表的lob move
    表包含lob字段,需要收回空间,首先move表,move表,move完表后lob的空间并不会释放,还需要针对lob字段进行move:非分区表lob的move:alter table  T_SEND...
    99+
    2022-10-18
    lob paratition move
  • db2 定义分区表和分区键
    下面,为了提高数据库性能,我们将不同的分区放到不同的表空间下。首先创建6个表空间,3个数据表空间,3个索引表空间:db2 "create tablespace ts_dat managed by ...
    99+
    2022-10-18
    db2 分区表 %d
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作