ORACLE分区表总结(转)

一. 分区表理论知识

       Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。

       Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

 

When to Partition a Table什么时候需要分区表,官网的2个建议如下:

(1)Tables greater than 2GB should always be considered for partitioning.

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

 

在oracle 10g中最多支持:1024k-1个分区:

      Tables can be partitioned into up to 1024K-1 separate partitions

 

联机文档上有关分区表和索引的说明:

      Partitioned Tables and Indexes

       http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/partconc.htm#sthref2604

 

分区提供以下优点:

       (1)由于将数据分散到各个分区中,减少了数据损坏的可能性;

       (2)可以对单独的分区进行备份和恢复;

       (3)可以将分区映射到不同的物理磁盘上,来分散IO;

       (4)提高可管理性、可用性和性能。

 

Oracle 10g提供了以下几种分区类型:

       (1)范围分区(range);

       (2)哈希分区(hash);

       (3)列表分区(list);

       (4)范围-哈希复合分区(range-hash);

       (5)范围-列表复合分区(range-list)。

 

Range分区:

  Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。

       如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。

       在按时间分区时,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。

 

如:

create table pdba (id number, time date) partition by range (time)

(

partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')),

partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')),

partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')),

partition p4 values less than (maxvalue)

)

 

Hash分区:

  对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

 

如:

create table test

(

transaction_id number primary key,

item_id number(8) not null

)

partition by hash(transaction_id)

(

partition part_01 tablespace tablespace01,

partition part_02 tablespace tablespace02,

partition part_03 tablespace tablespace03

);

在这里,我们指定了每个分区的表空间。

 

List分区:

  List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。

  在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

 

在根据某字段,如城市代码分区时,可以指定default,把非分区规则的数据,全部放到这个default分区。

 

如:

create table custaddr
(

  id                     varchar2(15 byte)   not null,

  areacode   varchar2(4 byte)
 )

partition by list (areacode)
( partition t_list025 values ('025'),  
 partition t_list372 values ('372') , 
 partition t_list510 values ('510'), 

partition p_other values (default)

)

 

组合分区:

       如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

  组合分区呢在10g中有两种:range-hash,range-list。注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。

 

如:

create table test

(

transaction_id number primary key,

transaction_date date

)

partition by range(transaction_date) subpartition by hash(transaction_id)

subpartitions 3 store in (tablespace01,tablespace02,tablespace03)

(

partition part_01 values less than(to_date(’2009-01-01’,’yyyy-mm-dd’)),

partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)),

partition part_03 values less than(maxvalue)

);

 

create table emp_sub_template (deptno number, empname varchar(32), grade number)  

     partition by range(deptno) subpartition by hash(empname)

     subpartition template

         (subpartition a tablespace ts1,

          subpartition b tablespace ts2,

          subpartition c tablespace ts3,

          subpartition d tablespace ts4

         )

    (partition p1 values less than (1000),

     partition p2 values less than (2000),

     partition p3 values less than (maxvalue)

    );

 

 

create table quarterly_regional_sales

      (deptno number, item_no varchar2(20),

       txn_date date, txn_amount number, state varchar2(2))

  tablespace ts4

  partition by range (txn_date)

    subpartition by list (state)

      (partition q1_1999 values less than (to_date('1-apr-1999','dd-mon-yyyy'))

         (subpartition q1_1999_northwest values ('or', 'wa'),

          subpartition q1_1999_southwest values ('az', 'ut', 'nm'),

          subpartition q1_1999_northeast values ('ny', 'vm', 'nj'),

          subpartition q1_1999_southeast values ('fl', 'ga'),

          subpartition q1_1999_northcentral values ('sd', 'wi'),

          subpartition q1_1999_southcentral values ('ok', 'tx')

         ),

       partition q2_1999 values less than ( to_date('1-jul-1999','dd-mon-yyyy'))

         (subpartition q2_1999_northwest values ('or', 'wa'),

          subpartition q2_1999_southwest values ('az', 'ut', 'nm'),

          subpartition q2_1999_northeast values ('ny', 'vm', 'nj'),

          subpartition q2_1999_southeast values ('fl', 'ga'),

          subpartition q2_1999_northcentral values ('sd', 'wi'),

          subpartition q2_1999_southcentral values ('ok', 'tx')

         ),

       partition q3_1999 values less than (to_date('1-oct-1999','dd-mon-yyyy'))

         (subpartition q3_1999_northwest values ('or', 'wa'),

          subpartition q3_1999_southwest values ('az', 'ut', 'nm'),

          subpartition q3_1999_northeast values ('ny', 'vm', 'nj'),

          subpartition q3_1999_southeast values ('fl', 'ga'),

          subpartition q3_1999_northcentral values ('sd', 'wi'),

          subpartition q3_1999_southcentral values ('ok', 'tx')

         ),

       partition q4_1999 values less than ( to_date('1-jan-2000','dd-mon-yyyy'))

         (subpartition q4_1999_northwest values ('or', 'wa'),

          subpartition q4_1999_southwest values ('az', 'ut', 'nm'),

          subpartition q4_1999_northeast values ('ny', 'vm', 'nj'),

          subpartition q4_1999_southeast values ('fl', 'ga'),

          subpartition q4_1999_northcentral values ('sd', 'wi'),

          subpartition q4_1999_southcentral values ('ok', 'tx')

         )

      );

 

 

       在Oracle 11g中,组合分区功能这块有所增强,又增加了range-range,list-range,

list-list,list-hash,并且 11g里面还支持Interval分区和虚拟列分区。

 

这块可以参考Blog:

     Oracle 11g 新特性简介

       http://blog.youkuaiyun.com/tianlesoftware/archive/2010/01/06/5134819.aspx

 

       分区表 之 Interval分区 和 虚拟列 按星期分区表

       http://blog.youkuaiyun.com/tianlesoftware/archive/2010/06/10/5662337.aspx

 

 

二.  普通表转分区表方法

 

将普通表转换成分区表有4种方法:

       1. Export/import method

       2. Insert with a subquery method

       3. Partition exchange method

       4. DBMS_REDEFINITION

具体参考:

       How to Partition a Non-partitioned Table [ID 1070693.6]

       http://blog.youkuaiyun.com/tianlesoftware/archive/2011/03/02/6218704.aspx

 

       逻辑导出导入这里就不做说明,我们看看其他三种方法。

 

2.1  插入: Insert with a subquery method

     这种方法就是使用insert 来实现。 当然在创建分区表的时候可以一起插入数据,也可以创建好后在insert 进去。 这种方法采用DDL语句,不产生UNDO,只产生少量REDO,建表完成后数据已经在分布到各个分区中。

    

SQL> select count(*) from dba;

  COUNT(*)

----------

   2713235

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

 

SQL> select time_fee from dba where rownum<5;

TIME_FEE

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

2011-02-17 19:29:09

2011-02-17 19:29:15

2011-02-17 19:29:18

2011-02-17 19:29:20

SQL>

 

2.1.1  Oracle 11g的Interval

       在11g里的Interval创建,这种方法对没有写全的分区会自动创建。 比如我这里只写了1月日期,如果插入的数据有其他月份的,会自动生成对应的分区。

 

/* Formatted on 2011/03/02 15:41:09 (QP5 v5.115.810.9015) */

CREATE TABLE intervaldave

PARTITION BY RANGE (time_fee)

   INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )

   (PARTITION part1

       VALUES LESS THAN (TO_DATE ('01/12/2010', 'MM/DD/YYYY')))

AS

   SELECT   ID, TIME_FEE FROM DAVE;

 

 

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

 

TABLE_NAME                     PARTITION_NAME

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

INTERVALDAVE                   PART1

INTERVALDAVE                   SYS_P24

INTERVALDAVE                   SYS_P25

INTERVALDAVE                   SYS_P26

INTERVALDAVE                   SYS_P33

INTERVALDAVE                   SYS_P27

INTERVALDAVE                   SYS_P28

 

2.1.2  Oracle 10g 版本

       在10g里面,我需要写全所有的分区。

 

sql> create table pdba (id, time) partition by range (time)

  2 (partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')),

  3    partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')),

  4    partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')),

  5    partition p4 values less than (maxvalue))

  6    as select id, time_fee from dba;

表已创建。

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

TABLE_NAME                     PARTITION_NAME

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

PDBA                           P1

PDBA                           P2

PDBA                           P3

PDBA                           P4

sql> select count(*) from pdba partition (p1);

  count(*)

----------

   1718285

sql> select count(*) from pdba partition (p2);

  count(*)

----------

    183667

sql> select count(*) from pdba partition (p3);

  count(*)

----------

    188701

sql> select count(*) from pdba partition (p4);

  count(*)

----------

    622582

sql>

 

现在分区表已经建好了,但是表名不一样,需要用rename对表重命名一下:

SQL> rename dba to dba_old;

表已重命名。

SQL> rename pdba to dba;

表已重命名。

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

TABLE_NAME                     PARTITION_NAME

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

DBA                            P1

DBA                            P2

DBA                            P3

DBA                            P4

 

2.2 . 交换分区:Partition exchange method

     这种方法只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。适用于包含大数据量的表转到分区表中的一个分区的操作。尽量在闲时进行操作。

 

交换分区的操作步骤如下:

     1. 创建分区表,假设有2个分区,P1,P2.

     2. 创建表A存放P1规则的数据。

     3. 创建表B 存放P2规则的数据。

     4. 用表A 和P1 分区交换。 把表A的数据放到到P1分区

     5. 用表B 和p2 分区交换。 把表B的数据存放到P2分区。

 

创建分区表:

sql> create table p_dba

  2  (id number,time date)

  3  partition by range(time)

  4  (

  5  partition p1 values less than (to_date('2010-09-1', 'yyyy-mm-dd')),

  6  partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd'))

  7  );

表已创建。

 

注意:我这里只创建了2个分区,没有创建存放其他数据的分区。

 

创建2个分别对应分区的基表:

SQL> CREATE TABLE dba_p1 as SELECT id,time_fee FROM dba_old WHERE  time_fee<TO_DATE('2010-09-1', 'YYYY-MM-DD');

表已创建。

 

SQL> CREATE TABLE dba_p2 as SELECT id,time_fee FROM dba_old WHERE  time_fee<TO_DATE('2010-11-1', 'YYYY-MM-DD') and time_fee>TO_DATE('2010-09-1', 'YYYY-MM-DD');

表已创建。

 

SQL> select count(*) from dba_p1;

  COUNT(*)

----------

   1536020

SQL> select count(*) from dba_p2;

  COUNT(*)

----------

    365932

 

SQL>

 

讲2个基表与2个分区进行交换:

SQL> alter table p_dba exchange partition p1 with table dba_p1;

表已更改。

SQL> alter table p_dba exchange partition p2 with table dba_p2;

表已更改。

 

查询2个分区:

SQL> select count(*) from p_dba partition(p1);

  COUNT(*)

----------

   1536020

SQL> select count(*) from p_dba partition(p2);

  COUNT(*)

----------

    365932

注意:数据和之前的基表一致。

 

查询原来的2个基表:

SQL> select count(*) from dba_p2;

  COUNT(*)

----------

         0

SQL> select count(*) from dba_p1;

  COUNT(*)

----------

         0

注意: 2个基表的数据变成成0。

 

       在这里我们看一个问题,一般情况下,我们在创建分区表的时候,都会有一个其他分区,用来存放不匹配分区规则的数据。 在这个例子中,我只创建了2个分区,没有创建maxvalue分区。 现在我来插入一条不满足规则的数据,看结果:

 

SQL> insert into p_dba values(999999,to_date('2012-12-29','yyyy-mm-dd'));

insert into p_dba values(999999,to_date('2012-12-29','yyyy-mm-dd'))

            *

第 1 行出现错误:

ORA-14400: 插入的分区关键字未映射到任何分区

SQL> insert into p_dba values(999999,to_date('2009-12-29','yyyy-mm-dd'));

已创建 1 行。

SQL> select * from p_dba where id=999999;

 

        ID TIME

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

    999999 29-12月-09

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select * from p_dba where id=999999;

 

        ID TIME

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

    999999 2009-12-29 00:00:00

SQL>

 

       通过这个测试可以清楚,如果插入的数据不满足分区规则,会报ORA-14400错误。

 

2.3 . 使用在线重定义:DBMS_REDEFINITION

 

       在线重定义能保证数据的一致性,在大部分时间内,表都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

 

关于DBMS_REDEFINITION的介绍,参考官方连接:

      http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_redefi.htm#CBBFDJBC

 

关于用在线重定义创建分区表,参考:

       How To Partition Existing Table Using DBMS_Redefinition [ID 472449.1]

       http://blog.youkuaiyun.com/tianlesoftware/archive/2011/03/02/6218693.aspx

 

这个功能只在9.2.0.4以后的版本才有,在线重定义表具有以下功能:

       (1)修改表的存储参数;

       (2)将表转移到其他表空间;

       (3)增加并行查询选项;

       (4)增加或删除分区;

       (5)重建表以减少碎片;

       (6)将堆表改为索引组织表或相反的操作;

       (7)增加或删除一个列。

 

使用在线重定义的一些限制条件:

(1) There must be enough space to hold two copies of the table.

(2) Primary key columns cannot be modified.

(3) Tables must have primary keys.

(4) Redefinition must be done within the same schema.

(5) New columns added cannot be made NOT NULL until after the redefinition operation.

(6) Tables cannot contain LONGs, BFILEs or User Defined Types.

(7) Clustered tables cannot be redefined.

(8) Tables in the SYS or SYSTEM schema cannot be redefined.

(9) Tables with materialized view logs or materialized views defined on them cannot be redefined.

(10) Horizontal sub setting of data cannot be performed during the redefinition.

 

在Oracle 10.2.0.4和11.1.0.7 版本下,在线重定义可能会遇到如下bug:

       Bug 7007594 - ORA-600 [12261]

       http://blog.youkuaiyun.com/tianlesoftware/archive/2011/03/02/6218681.aspx

 

在线重定义的大致操作流程如下:

       (1)创建基础表A,如果存在,就不需要操作。

       (2)创建临时的分区表B。

       (3)开始重定义,将基表A的数据导入临时分区表B。

       (4)结束重定义,此时在DB的 Name Directory里,已经将2个表进行了交换。即此时基表A成了分区表,我们创建的临时分区表B 成了普通表。 此时我们可以删除我们创建的临时表B。它已经是普通表。

 

 

下面看一个示例:

 

1. 创建基本表和索引

sql> conn icd/icd;

已连接。

sql> create table unpar_table (

  2  id number(10) primary key,

  3  create_date date

  4  );

表已创建。

sql> insert into unpar_table select rownum, created from dba_objects;

已创建72288行。

sql> create index create_date_ind on unpar_table(create_date);

索引已创建。

sql> commit;

提交完成。

 

2. 收集表的统计信息

sql> exec dbms_stats.gather_table_stats('icd', 'unpar_table', cascade => true);

pl/sql 过程已成功完成。

 

3. 创建临时分区表

sql> create table  par_table (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));

表已创建。

 

4. 进行重定义操作

 

4.1 检查重定义的合理性

sql> exec dbms_redefinition.can_redef_table('icd', 'unpar_table');

pl/sql 过程已成功完成。

 

4.2 如果4.1 没有问题,开始重定义,这个过程可能要等一会。

 

这里要注意:如果分区表和原表列名相同,可以用如下方式进行:

SQL> BEGIN

DBMS_REDEFINITION.start_redef_table(

uname => 'ICD', 

orig_table => 'unpar_table',

int_table => 'par_table');

END;

/

       如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(

'ICD',

'unpar_table',

'par_table',

'ID ID, create_date TIME', -- 在这里指定新的映射关系

DBMS_REDEFINITION.CONS_USE_PK);

 

这一步操作结束后,数据就已经同步到这个临时的分区表里来了。

 

4.3 同步新表,这是可选的操作

SQL> BEGIN

  2  dbms_redefinition.sync_interim_table(

  3  uname => 'ICD',

  4  orig_table => 'unpar_table',

  5  int_table => 'par_table');

  6  END;

  7  /

PL/SQL 过程已成功完成。

 

4.4 创建索引,在线重定义只重定义数据,索引还需要单独建立。

sql> create index create_date_ind2 on par_table(time);

索引已创建。

 

4.5 收集新表的统计信息

sql> exec dbms_stats.gather_table_stats('icd', 'par_table', cascade => true);

pl/sql 过程已成功完成。

 

4.6 结束重定义

SQL> BEGIN

  2  dbms_redefinition.finish_redef_table(

  3  uname => 'ICD',

  4  orig_table => 'unpar_table',

  5  int_table => 'par_table');

  6  END;

  7  /

PL/SQL 过程已成功完成。

 

结束重定义的意义:

       基表unpar_table 和临时分区表par_table 进行了交换。 此时临时分区表par_table成了普通表,我们的基表unpar_table成了分区表。

 

       我们在重定义的时候,基表unpar_table是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。

 

5. 删除临时表

SQL> DROP TABLE par_table;

表已删除。

 

6. 索引重命名

SQL> ALTER INDEX create_date_ind2 RENAME TO create_date_ind;

索引已更改。

 

7. 验证

sql> select partitioned from user_tables where table_name = 'UNPAR_TABLE';

par

---

yes

sql> select partition_name from user_tab_partitions where table_name = 'UNPAR_TABLE';

partition_name

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

p1

p2

p3

p4

sql> select count(*) from unpar_table;

  count(*)

----------

     72288

sql> select count(*) from unpar_table partition (p4);

  count(*)

----------

     72288

sql>

 

 

三. 分区表的其他操作

3.1 添加新的分区

添加新的分区有2中情况:

(1)原分区里边界是maxvalue或者default。 这种情况下,我们需要把边界分区drop掉,加上新分区后,在添加上新的分区。 或者采用split,对边界分区进行拆分。

(2)没有边界分区的。 这种情况下,直接添加分区就可以了。

 

以边界分区添加新分区示例:

(1)分区表和索引的信息如下:

SQL> create table custaddr

  2  (

  3    id         varchar2(15 byte)   not null,

  4    areacode   varchar2(4 byte)

  5  )

  6  partition by list (areacode)

  7  (

  8    partition t_list556 values ('556') tablespace icd_service,

  9    partition p_other values (default)tablespace icd_service

 10  );

表已创建。

SQL> create index ix_custaddr_id on custaddr(id)

  2  local (

  3    partition t_list556  tablespace icd_service,

  4    partition p_other tablespace icd_service

  5  );

索引已创建。

 

(2)插入几条测试数据:

SQL> insert into custaddr values('1','556');

已创建 1 行。

SQL> insert into custaddr values('2','551');

已创建 1 行。

SQL> insert into custaddr values('3','555');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from custaddr;

ID              AREA

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

1               556

2               551

3               555

SQL> select * from custaddr partition(t_list556);

ID              AREA

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

1               556

SQL>

 

(3)删除default分区

sql> alter table custaddr drop partition p_other;

表已更改。

sql> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

table_name                     partition_name

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

custaddr                       t_list556

 

(4)添加新分区

SQL> alter table custaddr add partition t_list551 values('551') tablespace icd_service;

表已更改。

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

 

TABLE_NAME                     PARTITION_NAME

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

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

(5)添加default 分区

SQL> alter table custaddr add partition p_other values (default)  tablespace icd_service;

表已更改。

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

 

TABLE_NAME                     PARTITION_NAME

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

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

CUSTADDR                       P_OTHER

 

(6)对于局部索引,oracle会自动增加一个局部分区索引。验证一下:

sql> select owner,index_name,table_name,partitioning_type from dba_part_indexes where index_name='ix_custaddr_id';

owner            index_name           table_name

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

icd             ix_custaddr_id         custaddr

sql> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='ix_custaddr_id';

index_owner           index_name                  partition_name

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

icd                  ix_custaddr_id                 p_other

icd                  ix_custaddr_id                 t_list551

icd                  ix_custaddr_id                 t_list556

 

分区索引自动创建了。

 

3.2  split 分区拆分

       在3.1 中,我们说明了可以使用split的方式来添加分区。 这里我们用split方法继续上面的实验。

 

sql> alter table custaddr split partition p_other values('552') into (partition t_list552 tablespace icd_service, partition p_other tablespace icd_service);

表已更改。

--注意这里红色的地方,如果是Range类型的,使用at,List使用Values。

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

TABLE_NAME                     PARTITION_NAME

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

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

CUSTADDR                       T_LIST552

CUSTADDR                       P_OTHER

 

SQL> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='IX_CUSTADDR_ID';

 

index_owner             index_name                     partition_name

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

icd                            ix_custaddr_id                 p_other

icd                            ix_custaddr_id                 t_list551

icd                            ix_custaddr_id                 t_list552

icd                            ix_custaddr_id                 t_list556

 

注意:分区表会自动维护局部分区索引。全局索引会失效,需要进行rebuild。

 

3.3 合并分区Merge

       相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。

 

SQL> alter table custaddr merge partitions t_list552,p_other into partition p_other;

表已更改。

SQL> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='IX_CUSTADDR_ID';

index_owner       index_name         partition_name

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

icd              ix_custaddr_id          p_other

icd              ix_custaddr_id          t_list551

icd              ix_custaddr_id          t_list556

 

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

 

table_name                     partition_name

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

custaddr                       t_list556

custaddr                       t_list551

custaddr                       p_other

 

3.4 . 移动分区

SQL> alter table custaddr move partition P_OTHER tablespace system;

 

表已更改。

SQL> alter table custaddr move partition P_OTHER tablespace icd_service;

表已更改。

 

注意:分区移动会自动维护局部分区索引,oracle不会自动维护全局索引,所以需要我们重新rebuild分区索引,具体需要rebuild哪些索引,可以通过dba_part_indexes,dba_ind_partitions去判断。

 

SQL> Select index_name,status From user_indexes Where table_name='CUSTADDR';

 

INDEX_NAME                     STATUS

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

IX_CUSTADDR_ID                 N/A

 

      

3.5. Truncate分区

SQL> select * from custaddr partition(T_LIST556);

ID              AREA

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

1               556

SQL> alter table custaddr truncate partition(T_LIST556);

表被截断。

SQL> select * from custaddr partition(T_LIST556);

未选定行

 

说明:

       Truncate相对delete操作很快,数据仓库中的大量数据的批量数据加载可能会有用到;截断分区同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

3.6.  Drop分区

SQL> alter table custaddr drop partition T_LIST551;

表已更改。

 

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

TABLE_NAME                     PARTITION_NAME

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

CUSTADDR                       T_LIST556

CUSTADDR                       P_OTHER     

同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

 

四. 分区表的索引

       分区索引分为本地(local index)索引和全局索引(global index)。局部索引比全局索引容易管理, 而全局索引比较快。

 

与索引有关的表:

       dba_part_indexes 分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类型(local/global)

       dba_ind_partitions  每个分区索引的分区级统计信息

       dba_indexes/dba_part_indexes 可以得到每个表上有哪些非分区索引

 

       Local索引肯定是分区索引,Global索引可以选择是否分区,如果分区,只能是有前缀的分区索引。

 

分区索引分2类:有前缀(prefix)的分区索引和无前缀(nonprefix)的分区索引:

(1)有前缀的分区索引指包含了分区键,并且将其作为引导列的索引。

如:

create index i_id_global on PDBA(id) global  --引导列

  2  partition by range(id)  --分区键

  3  (partition p1 values less than (200),

  4  partition p2 values less than (maxvalue)

  5  );

这里的ID 就是分区键,并且分区键id 也是索引的引导列。

 

(2)无前缀的分区索引的列不是以分区键开头,或者不包含分区键列。

如:

create index ix_custaddr_local_id_p on custaddr(id)

local ( 

  partition t_list556 tablespace icd_service, 

  partition p_other tablespace icd_service

)   

 

       这个分区是按照areacode来的。但是索引的引导列是ID。 所以它就是非前缀分区索引。

 

全局分区索引不支持非前缀的分区索引,如果创建,报错如下:

SQL> create index i_time_global on PDBA(id) global  --索引引导列

  2  partition by range(time) --分区建

  3  (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),

  4  partition p2 values less than (maxvalue)

  5  );

partition by range(time)

                       *

第 2 行出现错误:

ORA-14038: GLOBAL 分区索引必须加上前缀

 

 

4.1  Local 本地索引

       对于local索引,当表的分区发生变化时,索引的维护由Oracle自动进行。

 

注意事项:

(1) 局部索引一定是分区索引,分区键等同于表的分区键。

(2) 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。

(3) 局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。

(4) 局部分区索引是对单个分区的,每个分区索引只指向一个表分区;全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。

(5) 位图索引必须是局部分区索引。

(6) 局部索引多应用于数据仓库环境中。

(7) B树索引和位图索引都可以分区,但是HASH索引不可以被分区。

 

 

示例:

sql> create index ix_custaddr_local_id on custaddr(id) local;

索引已创建。

 

和下面SQL 效果相同,因为local索引就是分区索引:

create index ix_custaddr_local_id_p on custaddr(id)

local ( 

  partition t_list556 tablespace icd_service, 

  partition p_other tablespace icd_service

)   

 

SQL> create index ix_custaddr_local_areacode on custaddr(areacode) local;

索引已创建。

 

验证2个索引的类型:

SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from user_part_indexes where table_name='CUSTADDR';

 

index_name                table_name partition locali alignment

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

ix_custaddr_local_areacode     custaddr   list      local  prefixed

ix_custaddr_local_id           custaddr   list      local  non_prefixed

 

       因为我们的custaddr表是按areacode进行分区的,所以索引ix_custaddr_local_areacode是有前缀的索引(prefixed)。而ix_custaddr_local_id是非前缀索引。

 

4.2  Global索引

       对于global索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。全局分区索引只能是B树索引,到目前为止(10gR2),oracle只支持有前缀的全局索引。

       另外oracle不会自动的维护全局分区索引,当我们在对表的分区做修改之后,如果对分区进行维护操作时不加上update global indexes的话,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。      

 

注意事项:

(1)全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。

(2)全局索引可以依附于分区表;也可以依附于非分区表。

(3)全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。

(4)全局索引多应用于oltp系统中。

(5)全局分区索引只按范围或者散列分区,hash分区是10g以后才支持。

(6) oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。

(7) 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

 

 

注意:Oracle只支持2中类型的全局分区索引:

           range partitioned 和 Hash Partitioned.

 

官网的说明如下:

Global Partitioned Indexes

       Oracle offers two types of global partitioned index: range partitioned and hash partitioned.

(1)Global Range Partitioned Indexes

       Global range partitioned indexes are flexible in that the degree of partitioning and the partitioning key are independent from the table's partitioning method. They are commonly used for OLTP environments and offer efficient access to any individual record.

       The highest partition of a global index must have a partition bound, all of whose values are MAXVALUE. This ensures that all rows in the underlying table can be represented in the index. Global prefixed indexes can be unique or nonunique.

       You cannot add a partition to a global index because the highest partition always has a partition bound of MAXVALUE. If you wish to add a new highest partition, use the ALTER INDEX SPLIT PARTITION statement. If a global index partition is empty, you can explicitly drop it by issuing the ALTER INDEX DROP PARTITION statement. If a global index partition contains data, dropping the partition causes the next highest partition to be marked unusable. You cannot drop the highest partition in a global index.

(2)Global Hash Partitioned Indexes

       Global hash partitioned indexes improve performance by spreading out contention when the index is monotonically growing. In other words, most of the index insertions occur only on the right edge of an index.

 

(3)Maintenance of Global Partitioned Indexes

       By default, the following operations on partitions on a heap-organized table mark all global indexes as unusable:

ADD (HASH)

COALESCE (HASH)

DROP

EXCHANGE

MERGE

MOVE

SPLIT

TRUNCATE

 

示例1 全局索引,全局索引对所有分区类型都支持:

sql> create index ix_custaddr_ global_id on custaddr(id) global;

索引已创建。

 

示例2:全局分区索引,只支持Range 分区和Hash 分区:

 

(1)创建2个测试分区表:

sql> create table pdba (id number, time date) partition by range (time)

  2  (

  3  partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')),

  4  partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')),

  5  partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')),

  6  partition p4 values less than (maxvalue)

  7  );

表已创建。

 

SQL> create table Thash

  2  (

  3  id number primary key,

  4  item_id number(8) not null

  5  )

  6  partition by hash(id)

  7  (

  8  partition part_01,

  9  partition part_02,

 10  partition part_03

 11  );

 

表已创建。

 

(2)创建分区索引

 

示例2:全局分区索引

 

SQL> create index i_id_global on PDBA(id) global

  2  partition by range(id)

  3  (partition p1 values less than (200),

  4  partition p2 values less than (maxvalue)

  5  );

索引已创建。

--这个是有前缀的分区索引。

 

SQL> create index i_time_global on PDBA(id) global

  2  partition by range(time)

  3  (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),

  4  partition p2 values less than (maxvalue)

  5  );

partition by range(time)

                       *

第 2 行出现错误:

ORA-14038: GLOBAL 分区索引必须加上前缀

 

 

SQL> create index i_time_global on PDBA(time) global

  2  partition by range(time)

  3  (partition p1 values less than (TO_DATE('2010-12-1', 'YYYY-MM-DD')),

  4  partition p2 values less than (maxvalue)

  5  );

索引已创建。

--有前缀的分区索引

 

SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from user_part_indexes where table_name='PDBA';

index_name            table_name partition locali alignment

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

i_id_global             pdba       range     global prefixed

i_time_global           pdba       range     global prefixed

 

SQL> CREATE INDEX ix_hash ON PDBA (id,time) GLOBAL

  2       PARTITION BY HASH (id)

  3       (PARTITION p1,

  4        PARTITION p2,

  5        PARTITION p3,

  6        PARTITION p4);

索引已创建。

 

只要索引的引导列包含分区键,就是有前缀的分区索引。

 

 

4.3 索引重建问题

 

(1)分区索引

       对于分区索引,不能整体进行重建,只能对单个分区进行重建。语法如下:

       Alter index idx_name rebuild partition index_partition_name [online nologging]

说明:

       online:表示重建的时候不会锁表。

       nologging:表示建立索引的时候不生成日志,加快速度。

      

如果要重建分区索引,只能drop表原索引,在重新创建:

       SQL>create index loc_xxxx_col on xxxx(col) local tablespace SYSTEM;

       这个操作要求较大的临时表空间和排序区。

 

示例:

SQL> select index_name,partition_name from user_ind_partitions where index_name='I_TIME_GLOBAL';

INDEX_NAME                     PARTITION_NAME

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

I_TIME_GLOBAL                  P1

I_TIME_GLOBAL                  P2

 

SQL>  alter index I_TIME_GLOBAL rebuild partition p1 online nologging;

索引已更改。

SQL> alter index I_TIME_GLOBAL rebuild partition p2 online nologging;

索引已更改。

 

(2)全局索引

       Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update  index,则会导致全局索引失效,需要重建。

 

SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL';

 

owner         index_name                     table_name status

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

sys           ix_pdba_global                 pdba       valid

 

删除一个分区:

SQL> alter table pdba drop partition p2;

表已更改。

 

SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL';

owner            index_name          table_name status

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

sys             ix_pdba_global         pdba       valid

 

split 分区:

SQL> alter table pdba split partition P4 at(TO_DATE('2010-12-21 00:00:00','YYYY-MM-DD HH24:MI:SS')) into (partition P4, partition P5);

表已更改。

 

SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL';

owner        index_name                     table_name status

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

sys          ix_pdba_global                 pdba       valid

 

drop 分区时使用update indexes

SQL> alter table pdba drop partition P4 UPDATE INDEXES;

表已更改。

SQL> select owner,index_name,table_name,status from dba_indexes where INDEX_NAME='IX_PDBA_GLOBAL';

owner          index_name           table_name status

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

sys             ix_pdba_global        pdba       valid

 

 

做了几个drop分区操作,全局索引没有失效,有点奇怪。 不过如果在生产环境中,还是小心点。

 

重建全局索引命令如下:

       Alter index idx_name rebuild [online nologging]

示例:

SQL> Alter index ix_pdba_global rebuild online nologging;

索引已更改。

 

 

 

补充一点,分区表存储空间的问题:

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

TABLE_NAME PARTITION_NAME                 TABLESPACE_NAME
---------- ------------------------------ ------------------------------
DBA        P1                             SYSTEM
DBA        P2                             SYSTEM
DBA        P3                             SYSTEM
DBA        P4                             SYSTEM

通过user_tab_partitions 表可以查看到每个分区对应的tablesapce_name. 但是,如果通过all_tables 表,却查不到分区表对应表空间的信息。


分区表:
SQL> select owner,table_name,tablespace_name,cluster_name from all_tables where table_name='DBA';

OWNER TABLE_NAME TABLESPACE_NAME                CLUSTER_NAME
----- ---------- ------------------------------ -----------------------------------------------------
SYS   DBA

普通表:
SQL> select owner,table_name,tablespace_name,cluster_name from all_tables where table_name='DAVE';

OWNER TABLE_NAME TABLESPACE_NAME                CLUSTER_NAME
----- ---------- ------------------------------ ---------------------------------------------------
SYS   DAVE       SYSTEM

从智能手机到汽车电子:聊聊IPC-9702/9704A标准如何帮我们搞定不同场景下的PCB可靠性设计 本文探讨了IPC-9702/9704A标准在智能手机和汽车电子等不同场景下的PCB可靠性设计应用。通过分析消费电子、汽车电子和工业设备中的应力特征,详细解读了IPC标准在应变识别和测试方法论中的核心价值,并提供了具体的轻量化设计策略和全生命周期验证方案,帮助工程师提升PCB的长期可靠性。 阅读详情

相关推荐

别再只盯着meta包了!盘点R语言中7个元分析工具包的特色与适用场景

本文深入评测了R语言中7个主流元分析工具包(meta、metafor、netmeta、mada、mvmeta、metasens、rmeta)的核心功能与适用场景,帮助研究者根据具体需求精准选型。通过对比表格和实际代码示例,详细解析了各工具包在传统两两比较、网络Meta分析、诊断准确性研究等不同场景下的差异化优势,并提供了性能对比和组合使用建议。

weixin_30736301的博客 297

Oracle分区表

达梦分区表分区个数多还是少?奇数还是偶数?

weixin_42018955的博客 3002

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境

NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。

王阿巴和王咕噜 1万+

Oracle分区表详解(Oracle Partitioned Tables)

当单表数据量随着时间变的越来越大时,会给数据的管理和查询带来不便。我们可以考虑对表进行分区,利用分区表特性将数据分成小块存储,可以大幅提升查询性能,管理便捷性及数据的可用性。目录一、分区表概述1.1 分区表概念1.2 何时使用分区表1.3 分区表的优点1.3.1 提升SQL查询性能1.3.2 提升表可管理性1.3.3 提升数据可用性二、基础分区策略2.1 范围分区(Range Partition)2.2 哈希分区(Hash Partition)2.3 列表分区(List partition)三、扩展分区策略

最简单的方法,解决最实际的问题。 2万+

你需要这样一个Ros软路由—— 路由器+外网+一号通ip线路=动态ip的WiFi信号

功能强大 管理便捷—给您全新的路由体验 一键更换指定线路or批量更换所有IP/MAC/SSID 自定义走本地网络策略的分流功能 设备批发价、不限制拨号账号服务商 强大的单设备/多设备IP去重功能 批量导入、管理一号通线路 一键任意切换5G_WiFi(推荐)/2.4G_WiFi(建议不用) 设备支持PPTP/L2TP/SSTP/openVP.N等协议 独家支持openVPN,适用于网络受限用户 支持自行接入AP和交换机扩容 一键打开/关闭所有虚拟WiFi 一键隐藏/显示设备WiFi...

米粒儿 4258

电价预测的Transformer实战:从注意力机制到超长序列建模

本文深入探讨了Transformer模型在电价预测领域的实战应用,对比了其与LSTM在处理长序列依赖和误差累积问题上的优劣。文章详细解析了自注意力机制的原理,并提供了处理超长序列的位置编码方法、构建专用预测模型的完整PyTorch代码,以及防止信息泄露的关键技巧。通过实战对比,展示了Transformer在并行计算、长距离建模和预测精度上的显著优势,并分享了应对极端波动和提升模型效率的高级优化策略。

f6g7h8i9j的博客 540

Oracle 史上最详细的分区表详解

一、分区表的概念 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据大大提高了数据查询的速度。 """分区表的具体作用""" Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外

dbhang的博客 2万+

STM32G030C8T6 ADC+DMA实战:同时采集外部电压和芯片温度的完整代码流程

本文详细介绍了STM32G030C8T6芯片通过ADC+DMA实现外部电压和芯片内部温度采集的完整流程。从硬件设计到CubeMX配置,再到驱动模块化实现与系统优化,提供了高精度多通道采集系统的实战指南,特别适合嵌入式开发者在工业控制和环境监测项目中应用。

weixin_42653691的博客 467

oracle 分区表 字符串,ORACLE分区表、分区索引详解(转)

今天逛论坛发现了一篇好文章,分享一下,自己也备个份,方便查找!!ORACLE分区表、分区索引ORACLE对于分区表方式其实就是将表分段存储,一般普通表格是一个段存储,而分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在那个分区或那几个内部,然后在分区内部去查找数据,一个分区一般保证四十多万条数据就比较正常了,但是分区表并非乱建立,而其维护性也相对较为复杂一点,而索引的...

weixin_33608403的博客 1970

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1899

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

【转】oracle分区表总结

在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 同事的分区表总结,转载一下。 1.1 分区表PARTITION table 在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 1.1.1 分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999...

weixin_33860737的博客 100

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3365

oracle分区表分区导出,Oracle 分区表 导出导入 迁移(转)

在Blog:分区表总结 里提到一种创建分区表的方法。使用导出导入。Oracle分区表总结这种方法的步骤是:(1)将普通表dump出来(2)创建分区表(3)将dump文件导入数据。分区表的迁移和这个步骤差不多。有2点要注意:(1)分区表导出的dump文件比普通表导出的大。(2)导入分区表的时间要比普通表的时间要长。补充一些exp/imp,expdp/impdp与分区表有关的知识:使用exp -hel...

weixin_35836405的博客 1560

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[转]oracle分区表总结

在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 同事的分区表总结,转载一下。1.1 分区表PARTITION table 在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 1.1.1 分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生...

翼づ坏坏的天空 186

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Oracle普通分区表转自动分区表

普通分区表修改为自动分区表需要删除 MAX 分区,同时,为了尽快让自动分区表生效,也会删除其他多余分区(本例是26/2-26/9)有数据分区需要处理,第一,数据是宝贵的,删除之前需要保存下来。第二,有数据的分区被删除,会导致全局索引失效。

green__apple的专栏 239

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

oracle分区表总结(转)

http://m77m78.itpub.net/post/125/280787 1.1 分区表PARTITION table 在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 1.1.1 分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: ...

zhanyingle_1981的专栏 124

Oracle中分区表的使用(转)

 Oracle中分区表的使用 本文作者Dinya (dinya20@tom.com)     摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。     正文:在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快

后天等的专栏 882

oracle分区表【转】

[size=small]oracle分区表 1.表空间及分区表的概念 表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空...

lt89102476的博客 174

oracle 分区表转非分区,分区表学习之一 ---非分区表转为分区表实验

1、创建结构相同的分区表CREATE TABLE POSTXNJNLHIS_PART("LOGNO" CHAR(14),"LOGDAT" CHAR(8),"TTXNCD" CHAR(10),"TXNTYP" CHAR(1),"TXNCD" CHAR(10),"SYSDAT" CHAR(8),"TXNTM" CHAR(6),"TRMTYP" CHAR(1),"TXNSTS" CHAR(1),"PRO...

weixin_42484477的博客 928

【转】 ORACLE 分区表 PARTITION table

ORACLE 分区表 PARTITION table http://blog.chinaunix.net/u/6889/showart_315897.html 1.1 分区表PARTITION table在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。1.1.1 分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在

strawbingo的专栏 656

【转】oracle分区表

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 转自:http://tianzt.blog.51cto.com/459544/171759 对本文实际作者表示感谢,本人不提供二次转载,谢谢 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 ...

icore 115

[转]Oracle中分区表的使用

前提: 查询分区:Select *From user_extents WHERE partition_name='分区名'; 1)创建表空间 create tablespace HRPM...

cong31848的博客 126
上一篇: Oracle 临时表用法
下一篇: ORACLE外键约束
junmail
博客等级 码龄22年 159粉丝 452原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值