我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ORACLE11G 分区表新特性

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ORACLE11G 分区表新特性

1.引用分区表

使子表使用父表的分区条件进行分区,而无需在子表中额外添加用于分区的列,造成数据逆规范化,造成空间浪费等问题。

参考实例:

(1).创建主表

CREATE TABLE orders
(
   order#       NUMBER PRIMARY KEY,
   order_date   DATE NOT NULL,
   data         VARCHAR2 (30)
)
PARTITION BY RANGE
   (order_date)
   (
      PARTITION
         part_2016 VALUES LESS THAN (TO_DATE ('01-01-2017', 'dd-mm-yyyy')),
      PARTITION
         part_2017 VALUES LESS THAN (TO_DATE ('01-01-2018', 'dd-mm-yyyy')))
/

insert into orders values ( 1, to_date( '01-01-2017', 'dd-mm-yyyy' ), 'xxx' );
insert into orders values ( 2, to_date( '01-01-2016', 'dd-mm-yyyy' ), 'yyy' );

commit;


(2).创建子表

create table order_line_items
    ( 
      order#      number NOT NULL,
      line#      number NOT NULL,
      data      varchar2(30),
      constraint c1_pk primary key(order#,line#),
      constraint c1_fk_p foreign key(order#) references orders
    )
    enable row movement
   partition by reference(c1_fk_p)
   /

insert into order_line_items values  ( 1, 1, 'yyy' );
insert into order_line_items values  ( 2, 1, 'yyy' );


  SELECT table_name, partition_name
    FROM user_tab_partitions
   WHERE table_name IN ('ORDERS', 'ORDER_LINE_ITEMS')
ORDER BY table_name, partition_name;

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
ORDERS               PART_2016
ORDERS               PART_2017
ORDER_LINE_ITEMS     PART_2016
ORDER_LINE_ITEMS     PART_2017


(3).删除父表partition,可以级联删除子表分区

alter table orders drop partition part_2016 update global indexes;

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
ORDERS               PART_2017
ORDER_LINE_ITEMS     PART_2017


(4).添加父表partition,可以级联添加子表分区

alter table orders add partition part_2018 values less than (to_date( '01-01-2019', 'dd-mm-yyyy' ));

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
ORDERS               PART_2017
ORDERS               PART_2018
ORDER_LINE_ITEMS     PART_2017
ORDER_LINE_ITEMS     PART_2018


(5).删除子表partition,报错

alter table order_line_items drop partition PART_2017 update global indexes;

ORA-14255: table is not partitioned by Range, List, Composite Range or Composite List method


(6).truncate子表partition,可行。

alter table admin.order_line_items truncate partition PART_2017;


2.间隔分区表

定义分区规则,当有符合条件的数据插入时自动创建分区。

可以使用alter命令将现有的区间分区表修改为间隔分区,也可以使用create创建一个间隔分区。

interval分区的特点
-由range分区派生而来
-以定长宽度创建分区(比如年、月、具体的数字(比如100、500等))
-分区字段必须是number或date类型
-必须至少指定一个range分区(永久分区)
-当有记录插入时,系统根据需要自动创建新的分区和本地索引
-已有的范围分区可被转换成间隔分区(通过ALTER TABLE SET INTERVAL选项完成)
-Interval Partitioning不支持支持索引组织表
-在Interval Partitioning表上不能创建domain index


参考示例:

- 创建间隔分区表

CREATE TABLE admin.orders2
(
   order#       NUMBER PRIMARY KEY,
   order_date   DATE NOT NULL
)
PARTITION BY RANGE
   (order_date)
   INTERVAL ( NUMTOYMINTERVAL (1, 'month') )
   (
      PARTITION
         p201612 VALUES LESS THAN (TO_DATE ('01-01-2017', 'dd-mm-yyyy')));

- 插入数据

insert into admin.orders2 values(1,TO_DATE ('01-12-2016', 'dd-mm-yyyy'));
insert into admin.orders2 values(2,TO_DATE ('02-01-2017', 'dd-mm-yyyy'));
insert into admin.orders2 values(3,TO_DATE ('02-02-2017', 'dd-mm-yyyy'));

查看自动生成分区

  SELECT table_name, partition_name
    FROM user_tab_partitions
   WHERE table_name IN ('ORDERS2')
ORDER BY table_name, partition_name;

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
ORDERS2              P201612
ORDERS2              SYS_P121
ORDERS2              SYS_P122


- 删除数据已生成的分区不变

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
ORDERS2              P201612
ORDERS2              SYS_P121
ORDERS2              SYS_P122


- 将原有的range分区表变更为interval分区表

ALTER TABLE admin.orders SET INTERVAL(1000000);
ALTER TABLE admin.orders SET INTERVAL (NUMTODSINTERVAL(1,'DAY')); --NUMTODSINTERVAL常用的单位有 ('day','hour','minute','second')
ALTER TABLE admin.orders SET INTERVAL (numtoyminterval(1,'month')); --numtoyminterval常用的单位有'year','month'


- 将interval分区表转为range分区表

ALTER TABLE admin.orders3 SET INTERVAL();


3.虚拟列分区

以下内容来自https://www.cnblogs.com/moonandstar08/p/5100567.html

(1).只能在堆组织表(普通表)上创建虚拟列
(2).虚拟列不能是LOB或者RAW类型;
(3).虚拟列的值并不是真实存在的,只有用到时,才根据表达式计算出虚拟列的值,磁盘上并不存放。
(4).可把虚拟列当做分区关键字建立分区表,这是ORACLE 11g的另一新特性--虚拟列分区
创建带有虚拟列的分区表:
   create table test(n1 number, c1 varchar2(80), n2 number generated always as (n1*0.8)) ---创建带有虚拟列的分区
   create table test1(n1 number,
                 c1 varchar2(80),
                 v1 varchar2(2) generated always as (substr(c1,1,1))
                 )
   partition by list (v1)
    (partition v11 values('I'),
     partition v12 values('O'),
     partition v13 values('E'),
     partition v15 values(default)
    );
查询:select * from test1 partition(v11);
(5).可在虚拟列上建立索引
   create index inx_test on test1(v1);
(6).如果在已经创建的表中增加虚拟列时,若没有指定虚拟列的字段类型;
ORACLE会根据 generated always as 后面的表达式计算的结果自动设置该字段的类型
(7).虚拟列的值由ORACLE根据表达式自动计算得出,不可以做UPDATE和INSERT操作, 可以对虚拟列做 DELETE 操作
(8).表达式中的所有列必须在同一张表
(9).表达式不能使用其他虚拟列


4.系统分区表

- 系统自动生成分区,无分区条件

- 数据和分区没有关系

- 不能建立local index

- 插入数据时要指明分区

CREATE TABLE admin.order4
(
   col1   NUMBER,
   name   VARCHAR2 (100)
)
PARTITION BY SYSTEM
(PARTITION p1,
 PARTITION p2,
 PARTITION p3,
 PARTITION p4);


 insert into admin.order4 partition(p2) select col1,name from admin.order4;


5.完全组合分区

(1).范围分区(range)
(2).哈希分区(hash)
(3).列表分区(list)
(4).范围-哈希复合分区(range-hash)
(5).范围-列表复合分区(range-list)
oracle11g 新增
range-range,list-range,list-list,list-hash


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ORACLE11G 分区表新特性

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

下载Word文档

猜你喜欢

Java新特性:Lambda表达式

Java新特性:Lambda表达式 Lambda 表达式(Lambda expression),也可称为闭包(Closure),是 Java(SE)8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口。Lambd
2023-08-17

MySQL 8.0新特性完整列表

下面简要列出了 MySQL 8.0 中的新功能 -事务数据字典用于存储有关对象信息的事务数据字典。原子数据定义语言原子数据定义语言 (DDL) 语句,用于组合对数据字典、存储引擎操作等进行的更新。安全性增强安全级别得到了提高,DBA(数据库
2023-10-22

Java8新特性-Lambda表达式详解

Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Lambda表达式,也可称为闭包,它是推动Java8发布的最重要新特性。本文通过详细的代码示例介绍了Java8新特性感兴趣的朋友可以参考一下
2023-05-16

编程热搜

目录