精华内容
下载资源
问答
  • oracle交换分区(exchangepartition)提供了一种方式,让你在表与表或分区与分区之间迁移数据,由于其采用了更改数据字典的方式,几乎不涉及io操作,因此效率极高。exchangepartition适用于所有分区格式,可以将数据从...

    oracle交换分区(exchange

    partition)提供了一种方式,让你在表与表或分区与分区之间迁移数据,由于其采用了更改数据字典的方式,几乎不涉及io操作,因此效率极高。exchange

    partition适用于所有分区格式,可以将数据从分区表迁移到非分区表,也可以从非分区表迁移至分区表,但不支持range partition

    和range partition之间交换。

    探究测试一:创建本地索引

    SQL>CREATE TABLE ou_a (a INTEGER)

    PARTITION BY RANGE(a)

    (PARTITION p1 VALUES LESS THAN (5),

    PARTITION p2 VALUES LESS THAN (6),

    PARTITION p3 VALUES LESS THAN (7),

    PARTITION p4 VALUES LESS THAN (8),

    PARTITION p5 VALUES LESS THAN (9)

    );

    SQL> insert into ou_a values(5);

    SQL> insert into ou_a values(6);

    SQL> insert into ou_a values(7);

    SQL> insert into ou_a values(8);

    SQL> commit;

    SQL> create index index_ou on ou_a(a) local;

    SQL> create table ou_temp (a integer);

    SQL> insert into ou_temp values(8);

    SQL> commit;

    SQL> alter table ou_a exchange partition p2  with table ou_temp;

    ORA-14099: 未对指定分区限定表中的所有行

    此处说明当交换分区表时,临时表的数据分区键值超出分区的临界值时会报ORA-14099错误,如需要屏蔽该错误,则需使用Without validation,如下:

    SQL> alter table ou_a exchange partition p2  with table ou_temp without validation;

    Table altered

    SQL> select a.Partition_Name, a.status from User_Ind_Partitions a where a.Index_Name = 'INDEX_OU';

    PARTITION_NAME                 STATUS

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

    P1                             USABLE

    P2                             UNUSABLE

    P3                             USABLE

    P4                             USABLE

    此时查看索引状态会发现,交换分区后本地索引在分区p2里失效,变为不可用。

    SQL> select * from ou_a where a=8;

    A

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

    8

    SQL> select * from ou_a;

    A

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

    8

    6

    7

    8

    当索引失效时,查看全表是可以查到两条为8的数据,而走where a=8时确只能查到一条数据。这是因为where

    a=8时,oracle通过分区修剪去找分区p5,而此时因为8的两个值一个存储在p2一个存储在p5,所以说当使用without

    validation时会造成很多无效的数据,同时亦会造成索引失效的问题。

    那如何保证索引不失效勒,oracle提供了一个参数including indexes,可保证交换分区后索引是有效的。如下:

    SQL> alter table ou_a exchange partition p2  with table ou_temp including indexes without validation;

    SQL> select status from User_Ind_Partitions a where a.Index_Name = 'INDEX_OU';

    STATUS

    --------

    USABLE

    USABLE

    USABLE

    USABLE

    USABLE

    此时发现索引交换过来了,说明including indexes可以将索引交换过来。

    以上实验 的知识点

    1、exchange partition,交换分区是分区表与表之间的交换,不支持分区表与分区表之间的交换,可做实验验证。同时是数据的迁移过程。

    2、without validation,可避免ORA-14099错误,但需注意的是有可能会造成索引失效问题。

    3、including indexes,交换分区时可将索引相互交换,可用来避免索引的失效。

    探究测试一:创建全局索引

    SQL> create table ou_part (a integer)

    partition by range(a)

    (

    PARTITION OU_PART_01 VALUES less than(10) tablespace TS_OU_01,

    partition ou_part_02 values less than(20) tablespace ts_ou_02,

    partition ou_part_03 values less than(30) tablespace ts_ou_03,

    partition ou_part_04 values less than(40) tablespace ts_ou_04

    );

    SQL>insert into ou_part values (1);

    SQL>insert into ou_part values (2);

    SQL>insert into ou_part values (3);

    SQL>insert into ou_part values (11);

    SQL>insert into ou_part values (12);

    SQL>insert into ou_part values (13);

    SQL>insert into ou_part values (21);

    SQL>insert into ou_part values (22);

    SQL>insert into ou_part values (23);

    SQL>insert into ou_part values (31);

    SQL>insert into ou_part values (32);

    SQL>insert into ou_part values (33);

    SQL> commit;

    SQL> create index index_glo on ou_part (a) Global;

    SQL> create table t (a integer);

    SQL> insert into t values(51);

    SQL> commit;

    SQL> alter table ou_part exchange partition OU_PART_01 with table t without validation;

    SQL> select status from User_Indexes a where a.index_name = 'INDEX_GLO' ;

    STATUS

    --------

    UNUSABLE

    此时发现索引已失效,针对本地索引失效后并不会影响其他分区索引的查询,那全局索引失效后,会有什么后果勒?

    SQL> select * from ou_part where a=11;

    ORA-01502: 索引 'SCOTT.INDEX_GLO' 或这类索引的分区处于不可用状态

    此时如果去查询表,则会报ORA-01502错误,Oracle针对索引可不用状态提供了一参数skip_unusable_indexes,默认值为false,表示是否跳过unusable索引。

    当skip_unusable_indexes=true时,oracle Optimizer会跳过索引,不检查索引的状态。如下所示:

    SQL> alter session set skip_unusable_indexes=true;

    SQL> select * from ou_part where a=11;

    A

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

    11

    此时Oracle没有报ORA-01502错误。

    此实验知识点:

    1、交换分区会使全局索引失效

    2、当全局索引失效且session set skip_unusable_indexes=false时,查询时会报ORA-01502错误。

    展开全文
  • 1.查看该分区有无数据select /*+ parallel(a 16)*/ count(1) from ZJ2_GRIDLEVSTA_cell_ALL_571 partition(SYS_P16805) a --where a.p_day=to_date(‘20171231‘,‘yyyymmdd‘);2.如果分区表里有主键,自增列,删掉...

    1.查看该分区有无数据

    select /*+ parallel(a 16)*/ count(1) from ZJ2_GRIDLEVSTA_cell_ALL_571 partition(SYS_P16805) a --where a.p_day=to_date(‘20171231‘,‘yyyymmdd‘);

    2.如果分区表里有主键,自增列,删掉

    alter table zj2_gridlevsta_all_571 drop primary key;

    drop index PK_ZJ2_GRIDLEVSTA_ALL_571_OID;

    alter table ZJ2_GRIDLEVSTA_CELL_ALL_571 modify oid drop identity;

    3.创建表,保证索引,非空约束与分区表一致

    create table ZJ2_GRIDLEVSTA_cell_ALL_571_b as select * from ZJ2_GRIDLEVSTA_cell_ALL_571 where 1=2;

    alter table ZJ2_GRIDLEVSTA_CELL_ALL_571_b modify oid not null;

    create index b_ECI_INDEX on ZJ2_GRIDLEVSTA_CELL_ALL_571_b (ECI);

    4.分区表和非分区表 交换分区

    alter table ZJ2_GRIDLEVSTA_cell_ALL_571 exchange partition SYS_P16805 with table ZJ2_GRIDLEVSTA_cell_ALL_571_b;

    注意:要交换的分区表中不能含有自增列,主键,否则可能无法交换分区

    select /*+ parallel(a 16) */ count(1) from 这种写法是可以多进程同时查看数据,效率要比普通查看效果快的多,但不可在程序中这样写,因为它会独占进程,多人同时查看的话会比普通方法

    还要慢。

    展开全文
  • oracle 交换分区

    千次阅读 2017-11-20 17:45:09
    怎么理解交换分区? 字面理解就是将源表和目标表的两个分区交换。 这种操作比较危险,慎用!!! 我今天做的实验是将一张分区表转到一张普通表,为的是实现数据迁移。 源表是分区表,目标表是普通表 执行语句 ...

    怎么理解交换分区?

    字面理解就是将源表和目标表的两个分区交换。

    这种操作比较危险,慎用!!!

    我今天做的实验是将一张分区表转到一张普通表,为的是实现数据迁移。

    源表是分区表,目标表是普通表

    执行语句

    alter table 源表 exchange subpartition  P_16_Z419001 with table 目标表;

    因为目标表是空表,所以将源表的分区数据替换为空,源表数据插入目标表。

    缺点是对于这种复合分区只能从子分区交换,子分区比较多就显得很繁琐,需要建多张普通表。

    alter table 源表 exchange subpartition  P_15_Z419001 with table 目标表;

    换个分区再次执行报错

    ORA-14283: UNIQUE 约束条件在 ALTER TABLE EXCHANGE SUBPARTITION 中不匹配

    给普通表加了主键索引解决。

    alter table 源表 exchange subpartition  P_15_Z419001 with table 目标表 without validation;

    再次执行发现问题,普通表的数据居然与源表的数据进行了交换,至此终于明白交换分区的机制。

    展开全文
  • Oracle 交换分区

    千次阅读 2016-04-24 21:42:14
    利用Oracle 交换分区你可以实现: ♦将一个分区(或子分区)转换成一个普通表。 ♦将一个普通表转换成一个分区表的分区(或子分区)。 ♦将一个哈希分区表转换成复合*哈希分区表的分区。 ♦将一个复合*哈希分区表...

    交换分区
    利用Oracle 交换分区你可以实现:

    ♦将一个分区(或子分区)转换成一个普通表。
    ♦将一个普通表转换成一个分区表的分区(或子分区)。
    ♦将一个哈希分区表转换成复合*哈希分区表的分区。
    ♦将一个复合*哈希分区表的分区转换成一个哈希分区表。
    ♦将一个(范围|列表)分区表转换成一个分区组合* 列表范围分区表。
    ♦将一个分区的复合*——(范围|列表)分区表转换到一个范围|列表分区表。

    本文内容参考翻译自Oracle11G 在线文档http://docs.oracle.com/cd/E11882_01/server.112/e10837/part_admin002.htm#i1007620

    可以指定INCLUDING INDEXES 来交换LOCAL 索引。
    当指定WITHOUT VALIDATION交换分区操作,这通常是一个快速操作,因为它只涉及到数据字典更新。
    当涉及的表和分区表有一个主键或是唯一性约束,那交换时执行WITH VALIDATION 来保证数据的完整性。
    为了避免这种验证的开销,可以在交换分区之前执行:

    ALTER TABLE table_name
         DISABLE CONSTRAINT constraint_name KEEP INDEX
    

    待交换分区完成后在ENABLE约束。

    交换一个 范围、HASH、列表分区到普通表

    ALTER TABLE stocks
        EXCHANGE PARTITION p3 WITH TABLE stock_table_3;
    

    1、交换一个间隔分区表

    Oracle11g中一种新的分区类型很好的解决了这个问题–interval partition,它是传统范围分区的扩展,使得分区表的使用和维护更加灵活。

    LOCK TABLE interval_sales
    PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
    IN SHARE MODE;
    
    ALTER TABLE interval_sales
    EXCHANGE PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
    WITH TABLE interval_sales_jun_2007
    INCLUDING INDEXES;
    

    注意使用FOR系统生成的语法来识别一个分区。 分区的名称可以通过查询使用*_TAB_PARTITIONS数据字典视图来找出系统生成的分区名称。

    示例:交换一个范围分区的分区到普通表

    ALTER TABLE orders
    EXCHANGE PARTITION p_2006_dec
    WITH TABLE orders_dec_2006
    UPDATE GLOBAL INDEXES;
    
    ALTER TABLE order_items_dec_2006
    ADD CONSTRAINT order_items_dec_2006_fk
    FOREIGN KEY (order_id)
    REFERENCES orders(order_id) ;
    
    ALTER TABLE order_items
    EXCHANGE PARTITION p_2006_dec
    WITH TABLE order_items_dec_2006;
    

    请注意,您必须使用UPDATE GLOBAL INDEXES或UPDATE INDEXES交换分区上的父表的主键索引仍然可用。 还请注意,您必须创建或允许的外键约束order_items_dec_2006表分区交换reference-partitioned表上的成功。

    2、交换一个HASH分区表到复合HASH分区

    首先,创建一个哈希分区表:

    CREATE TABLE t1 (i NUMBER, j NUMBER)
         PARTITION BY HASH(i)
           (PARTITION p1, PARTITION p2);
    

    填充表,然后创建一个range-hash分区表如下:

    CREATE TABLE t2 (i NUMBER, j NUMBER)
         PARTITION BY RANGE(j)
         SUBPARTITION BY HASH(i)
            (PARTITION p1 VALUES LESS THAN (10)
                SUBPARTITION t2_pls1
                SUBPARTITION t2_pls2,
             PARTITION p2 VALUES LESS THAN (20)
                SUBPARTITION t2_p2s1
                SUBPARTITION t2_p2s2));
    

    重要的是,t1表的分区键= t2表subpartitioning键。
    在迁移数据t1来t2,并验证行,使用以下语句:
    ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1
    WITH VALIDATION;

    3、交换一个复合HASH分区表的Subpartition

    使用ALTER TABLE…EXCHANGE SUBPARTITION声明将 复合HASH 分区表 subpartition 交换到一个普通标,或相反。 下面的例子将sales表 subpartition q3_1999_s1 交换到 表 q3_1999。 本地索引分区与相应的索引q3_1999。

    ALTER TABLE sales EXCHANGE SUBPARTITION q3_1999_s1
          WITH TABLE q3_1999 INCLUDING INDEXES;
    

    4、交换一个列表分区到复合列表分区表

    CREATE TABLE customers_apac
    ( id            NUMBER
    , name          VARCHAR2(50)
    , email         VARCHAR2(100)
    , region        VARCHAR2(4)
    , credit_rating VARCHAR2(1)
    )
    PARTITION BY LIST (credit_rating)
    ( PARTITION poor VALUES ('P')
    , PARTITION mediocre VALUES ('C')
    , PARTITION good VALUES ('G')
    , PARTITION excellent VALUES ('E')
    );
    

    填充表 ,然后创建一个list-list分区表:

    CREATE TABLE customers
    ( id            NUMBER
    , name          VARCHAR2(50)
    , email         VARCHAR2(100)
    , region        VARCHAR2(4)
    , credit_rating VARCHAR2(1)
    )
    PARTITION BY LIST (region)
    SUBPARTITION BY LIST (credit_rating)
    SUBPARTITION TEMPLATE
    ( SUBPARTITION poor VALUES ('P')
    , SUBPARTITION mediocre VALUES ('C')
    , SUBPARTITION good VALUES ('G')
    , SUBPARTITION excellent VALUES ('E')
    )
    (PARTITION americas VALUES ('AMER')
    , PARTITION emea VALUES ('EMEA')
    , PARTITION apac VALUES ('APAC')
    );
    

    很重要的customers_apac表中的subpartitioning键相匹配customers表

    ALTER TABLE customers
    EXCHANGE PARTITION apac
    WITH TABLE customers_apac
    WITH VALIDATION;
    

    5、交换一个子分区到复合列表分区表

    使用 ALTER TABLE … EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。

    6、交换一个范围分区表到复合范围分区表

    CREATE TABLE orders_mar_2007
    ( id          NUMBER
    , cust_id     NUMBER
    , order_date  DATE
    , order_total NUMBER
    )
    PARTITION BY RANGE (order_total)
    ( PARTITION p_small VALUES LESS THAN (1000)
    , PARTITION p_medium VALUES LESS THAN (10000)
    , PARTITION p_large VALUES LESS THAN (100000)
    , PARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
    );
    
    

    创建一个interval-range分区表:

    CREATE TABLE orders
    ( id          NUMBER
    , cust_id     NUMBER
    , order_date  DATE
    , order_total NUMBER
    )
    PARTITION BY RANGE (order_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
      SUBPARTITION BY RANGE (order_total)
      SUBPARTITION TEMPLATE
      ( SUBPARTITION p_small VALUES LESS THAN (1000)
      , SUBPARTITION p_medium VALUES LESS THAN (10000)
      , SUBPARTITION p_large VALUES LESS THAN (100000)
      , SUBPARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
      )
    (PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-
    MON-yyyy')));
    

    很重要的orders_mar_2007表中的subpartitioning键相匹配orders表

    LOCK TABLE orders PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) 
    IN SHARE MODE;
    
    ALTER TABLE orders
    EXCHANGE PARTITION
    FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
    WITH TABLE orders_mar_2007
    WITH VALIDATION;
    

    7、交换一个子分区到复合范围分区表

    使用 ALTER TABLE…EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。

    展开全文
  • Oracle交换分区对数据的加载提速案例环境:os:linuxdb:oracle10g其中一个库的数据加载非常慢,如何能提高数据的加载速度呢?下面是一个小例子。首先统计加载数据表所涉及的sql,这是做下面的基础。使用表tabname1...
  • oracle交换分区对数据的加载提速案例环境:os:linuxdb:oracle10gwww.2cto.com其中一个库的数据加载非常慢,如何能提高数据的加载速度呢?下面是一个小例子。首先统计加载数据表所涉及的sql,这是做下面的基础。...
  • oracle交换分区swap不足

    千次阅读 2017-02-19 21:00:57
    oracle对swap空间要求很大,因此,管理 oracle 的过程中经常会出现swap空间不足的情况,这时就要考虑扩展swap空间。 有两种解决方法:一是创建新的swap分区;另一则是创建swap文件。 一.增加一个新的swap分区  1...
  • oracle分区交换操作

    2021-05-02 02:38:55
    下面的例子主要验证执行分区交换操作时,oracle实际上并没有在两张表中移动数据,而是只是修改数据字典中段的指向。SQL> drop table t_nopartition;SQL> drop table t_partition;SQL> select sum(bytes) ...
  • oracle 分区交换

    2021-10-11 09:46:30
    需求 一个几亿条数据的分区表,要把一些老数据分出来,放一个新建的表上。按时间划分,指定时间以前的放在老数据表,指定时间以后的数据保留...交换分区的操作步骤如下 1. 创建分区表t1,假设有2个分区,P1,P2....
  • Oracle分区交换技术

    2019-10-11 09:51:42
    Oracle分区交换技术 需求: 在数据运维过程中,数据库的01表空间容量不够,需要将数据迁移到01表空间。 方法评估: 1.传统的insert into delete 方式,简单但需要消耗大量的计算资源和时间 2.分区交换技术 ,从...
  • author:skatetime:2012/07/16oracle交换分区对数据的加载提速案例环境:os:linuxdb:oracle10g其中一个库的数据加载非常慢,如何能提高数据的加载速度呢?下面是一个小例子。首先统计加载数据表所涉及的sql,这是...
  • 通过分区交换实现oracle分区表数据的快速迁移
  • Oracle分区交换功能,用来实现对数据“滑动窗口”操作,就是可以把数据从分区表中指定分区移出到一个表,或把一个表的数据移入到指定的分区中。[@more@]分区交换的速度是非常快速的,只是数据字典的更新,在移动...
  • 在REDHAT LINUX 5.5 X86_64操作系统上安装ORACLE 10G 时发现,SWAP 分区只有786M,安装程序check时报错。 REDHAT LINUX 5.5 是安装在VMWARE 的一个虚拟机上。分配了一个10G的磁盘用于安装操作系统和补丁...
  • Oracle交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2.2. 创建基表t11存放P1规则的数据。3. 创建基表t12 存Oracle交换分区的操作步骤如下:1. 创建分区表t1,假设有2个分区,P1,P2.2. 创建基表t...
  • 上周在客户一套BRM系统上执行分区交换Exchange Partition操作的时候出现了ORA-14098错误,该错误是由于分区表上的LOCAL分区索引与非分区表上的索引不匹配造成的,我们来看一下这个错误:[oracle@rh2 ~]$ oerr ora ...
  • 某日测试发现以下两个sql select * from tableName where risk_date = 20181201; --有数据 select * from tableName where risk_date = '20181201';...后来发现,20181201这天的数据不在P20181201这个分区...
  • 这种方法只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。适用于包含大数据量的表转到分区表中的一个分区的操作。...交换分区的操作步骤如下: 1. 创建分区表,假设有2...
  • 附录2:linux 下增加swap分区2008-10-23 10:581、检查当前的分区情况(使用free -m或cat /proc/swaps ):[root@db2 root]# free -mtotal used free shared buffers cachedMem: 1006 84 922 0 11 38-/+ buffers/cache...
  • [sql] ...普通表转分区表方法 将普通表转换成分区表有4种方法: 1. Export/import method 2. Insert with a subquery method 3. Partition exchange method 4. DBMS_REDEFINITION 
  • oracle分区表原理学习

    2019-07-08 16:56:00
    这是因为分区数量较多,oracle需要管理的段更多(见下图),在进行操作时会引发大量内部的递归调用(recursive calls),因而小表不建议建分区。   对指定时间进行查询: select * from normal_shp where day...
  • 一。说明: OLTP中有些表数据量大,而且会对历史数据...通过分区交换和表空间传输会很容易完成,而且性能上影响很小。 关于分区表更多内容:http://blog.csdn.net/tanqingru/article/category/1397435 关于表空间传
  • oracle分区交换技术

    千次阅读 2017-05-11 14:17:30
    交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2. 2. 创建基表t11存放P1规则的数据。 3. 创建基表t12 存放P2规则的数据。 4. 用基表t11和分区表T1的P1分区交换。 把表t11的数据放到到P1分区...
  • Exchange partition提供了一种方式,让你在表与表或分区分区之间迁移数据,注意不是将表转换成分区或非分区的形式,而仅只是迁移表中数据(互相迁移),由于其号称是采用了更改数据字典的方式,因此效率最高(几乎不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,324
精华内容 6,929
关键字:

oracle交换分区