oracle 表分区含义和使用场合,表分区的方式

1.表分区和使用场景

1.1 作用

  允许用户将表分成多个分区;用户可以执行查询,只访问表中特定的分区;将不同的分区存储在不同的磁盘上,提高访问性能和安全性;可以独立地备份和恢复每个分区;

查看表的分区信息:

select * from user_tab_partitions u where u.table_name='大写表名';

1.2 传统表分区的类型

1.2.1 范围分区

以表的一列或者一组列的值的范围分区

语法:

partition by range (列名)(
partition 分区1 values less than (范围1),
partition 分区2 values less than (范围2),
...
[partition 分区n values less than (maxvalue)]
);

如:

create table sales(
p_id varchar2(10),
s_count number
) partition by range (s_count )(
partition p1 values less than (1000),
partition p2 values less than (2000),
partition pn values less than (3000)
);

查看表的分区信息:

select * from user_tab_partitions u where u.table_name='SALES';

在这里插入图片描述
往分区表插入数据:
在这里插入图片描述
在这里插入图片描述

查询特定分区数据:

select * from sales partition(p1);

在这里插入图片描述
增加分区

alter table sales add partition p4 values less than (maxvalue);


在这里插入图片描述

1.2.2 散列分区

  允许用户对不具有逻辑范围的数据进行分区;通过在分区键上执行hash函数决定存储的分区;将数据平均分布到不同的分区;

如:

create table my_emp(empno number, ename varchar2(10))
partition by hash(empno)(partition p1,partition p2);

在这里插入图片描述

1.2.3 列表分区

  允许用户将不相关的数据组织到一起;

create table personCity(id number,city varchar2(10))
partition by list (city)(
partition p1 values('开封','商丘'),
partition p2 values('洛阳'),
partition p3 values('许昌'),
partition p4 values('高安')
);
1.2.4 复合分区

  范围分区与散列分区或列表分区的组合

partition by range (列名)
subpartition by hash(列名)
subpartitions 子分区数量
(
partition 分区1 values less than (范围1),
partition 分区2 values less than (范围2),
...
[partition 分区n values less than (maxvalue)]
);

子分区数量:对于每个分区会有n个子分区

create table student(sno number, sname varchar2(10))
partition by range (sno)
subpartition by hash(sname)
subpartitions 4
(
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than (maxvalue)
);

在这里插入图片描述
通过em查看表信息
在这里插入图片描述

1.3 11g新增分区

1.3.1 引用分区

  基于由外键引用的父表的分区的方法,它依赖于已有的父表子表关系,子表通过外键关联到父表,进而继承父表的分区方式而不需要自己创建,子表还继承父表的维护操作。

CREATE TABLE orders
    ( order_id NUMBER(12),
      order_date TIMESTAMP,
      order_mode VARCHAR2(8),
      customer_id NUMBER(6),
      order_status NUMBER(2),
      order_total NUMBER(8,2),
      sales_rep_id NUMBER(6),
      promotion_id NUMBER(6),
      CONSTRAINT orders_pk PRIMARY KEY(order_id)
    )
  PARTITION BY RANGE(order_date)
    ( PARTITION Q1 VALUES LESS THAN (TO_DATE('01-04-2022','DD-MM-YYYY')),
      PARTITION Q2 VALUES LESS THAN (TO_DATE('01-07-2022','DD-MM-YYYY')),
      PARTITION Q3 VALUES LESS THAN (TO_DATE('01-10-2022','DD-MM-YYYY')),
      PARTITION Q4 VALUES LESS THAN (TO_DATE('01-01-2023','DD-MM-YYYY'))
    );

CREATE TABLE order_items
    ( order_id NUMBER(12) NOT NULL,
      line_item_id NUMBER(3) NOT NULL,
      product_id NUMBER(6) NOT NULL,
      unit_price NUMBER(8,2),
      quantity NUMBER(8),
      CONSTRAINT order_items_fk
      FOREIGN KEY(order_id) REFERENCES orders(order_id)
    )
    PARTITION BY REFERENCE(order_items_fk);

在这里插入图片描述

1.3.2 间隔分区

  可以完全自动根据间隔阈值创建范围分区,是范围分区的扩展。在数据仓库中有广泛的应用。

create table sale_detail(
sale_detail_id number,
product_id number,
quantity number,
sale_date date
)
partition by range(sale_date)
interval(numtoyminterval(1,'MONTH'))
(partition p_202206 values less than(to_date('20220328','yyyymmdd')));

在这里插入图片描述

插入数据后自动增加分区

insert into sale_detail values(1,100,20,to_date('20220101','yyyymmdd'));
insert into sale_detail values (2,100,20,to_date('20220401','yyyymmdd'));
insert into sale_detail values(3,100,20,to_date('20220601','yyyymmdd'));
commit;

在这里插入图片描述

1.3 .3 基于虚拟列的分区

  把分区建立在某个虚拟列上,即建立在函数或表达式的计算结果上,来完成某种任务

create table sale(
sale_id number primary key,
product_id number,
price number,
quantity number,
sale_date date,
total_price as (price*quantity) virtual
)
partition by range(total_price)(
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than (maxvalue)
);
insert into sale(sale_id ,product_id,price,quantity,sale_date) values(1,100,20,50,to_date('20220101','yyyymmdd'));
commit;
select * from sale partition(p2);

在这里插入图片描述

1.3.4 系统分区

  不指定分区列,由oracle来完成分区的控制和管理,没有范围分区或者列表分区的界限

create table person(
id number,
name varchar2(20),
address varchar2(20)
)partition by system
(partition p1,
partition p2,
partition p3
);

在这里插入图片描述

2.分区操作

2.1 添加分区

alter table sales add partition p4 values less than (5000);

2.2 删除分区

alter table sales drop partition p4 ;

2.3 截断分区(删除分区中的数据)

alter table sales truncate  partition p4 ;

2.4 合并分区

alter table sales merge partitions p1 ,p2 into partition p2 ;

2.5 拆分分区

alter table sales split partition p2 at(1500) into (partition p1,partition p2) ;
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值