暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

oracle分区表

芃芃 2025-04-05
100

https://blog.csdn.net/weixin_63021300/article/details/132267190?ops_request_misc=%257B%2522request%255Fid%2522%253A%252266afe50b8c5bd0217df77fe2c5d166cd%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=66afe50b8c5bd0217df77fe2c5d166cd&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~top_positive~default-2-132267190-null-null.nonecase&utm_term=oracle&spm=1018.2226.3001.4450
什么时候用到分区表?

当表的数据量不断增大,查询数据的速度就会变慢,性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表的划分方式有4种:范围分区、hash分区、列表分区、组合分区。

12.1 范围分区
关键字:range

最常用的一种分区,范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。

常用于范围分区的字段:数值范围类(比如工资区间)、时间范围类(比如一月一月的来)。

例:

--范围分区(用sal列进行范围划分)

create table amp(

empno NUMBER(4),

ename VARCHAR2(10),

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(2)

)partition by range(sal)

(

partition sal_0_1000 values less than (1001),

partition sal_1001_2000 values less than (2001),

partition sal_2001_3000 values less than (3001),

partition sal_3001_maxv values less than (maxvalue)

);

--录入数据检验

insert into amp select * from emp;

select * from amp partition(sal_0_1000);

12.2 hash分区
关键字:hash

Hash分区通过数据库的内部的哈希算法,将所有的行,根据数据,放到不同的分区中进行保存。

Hash分区常用于划分没有啥规律的字段。

--hash分区(划分没有规律的字段),本例子划分4个区

create table bmp(

empno NUMBER(4),

ename VARCHAR2(10),

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(2)

)partition by hash(ename)

(

partition p1,

partition p2,

partition p3,

partition p4

)

;

--录入数据检验,查看分区1的数据

insert into bmp select * from emp;

select * from bmp partition(p1);



12.3 列表分区
关键字:list

该分区的特点是某列的值只有几个,并且存在一样的规律,基于这样的特点我们可以采用列表分区。

比如说性别字段,就可以分为男女两个分区。

create table cmp(

empno NUMBER(4),

ename VARCHAR2(10),

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(2)

)partition by list(deptno)

(

partition dept10 values(10),

partition dept20 values(20),

partition dept30 values(30),

partition dept40 values(40)

)

;

--录入数据检验

insert into cmp select * from emp;

select * from cmp partition(dept10);

12.4 组合分区
组合分区就是将范围分区、hash分区、列表分区组合起来进行分区。

写法:

create table 表名(

列名 数据类型

)partition by 父分区类型(列名)

subpartition by 子分区类型(列名)

(

partition 父分区名字 values 分区规则(

subpartition 子分区名字 values 分区规则,

subpartition 子分区名字 values 分区规则,

...

)

);

例:

--组合分区(以列表——范围为例子)

create table dmp(

empno NUMBER(4),

ename VARCHAR2(10),

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(2)

)partition by list(deptno)

subpartition by range(sal)

(

partition d10 values(10)

(

subpartition sal_10_1000 values less than (1001),

subpartition sal_10_2000 values less than (2001),

subpartition sal_10_maxv values less than (maxvalue)

),

partition d20 values(20)

(

subpartition sal_20_1000 values less than (1001),

subpartition sal_20_2000 values less than (2001),

subpartition sal_20_maxv values less than (maxvalue)

),

partition d30 values(30)

(

subpartition sal_30_1000 values less than (1001),

subpartition sal_30_2000 values less than (2001),

subpartition sal_30_maxv values less than (maxvalue)

),

partition d40 values(40)

(

subpartition sal_40_1000 values less than (1001),

subpartition sal_40_2000 values less than (2001),

subpartition sal_40_maxv values less than (maxvalue)

)

)

;

--录入数据检验

insert into dmp select * from emp;

--共4个主分区,12个子分区

select * from cmp partition(d10);

12.5 分区中分析常用语句
--增加分区subpartition

alter table 表名 modify partition 父分区名 add subpartition 子分区名;

--删除分区subpartition

alter table 表名 drop subpartition 子分区名;

select * from user_tables; --查看当前用户所有的表的信息

select * from user_tab_columns;--查看当前用户所有表的列信息

select * from user_tab_partitions; --查看用户所有的分区表信息

--主分区数据字典表

select * from user_tab_partitions;

--主分区数据字典表

SELECT * FROM user_tab_partitions WHERE TABLE_NAME='EMP_RANGE';

--子分区数据字典表

select * from user_tab_subpartitions;

--删除一个表的数据是

truncate table table_name;

--删除分区表一个分区的数据是

alter table table_name truncate partition p2;

12.6 分区中常见报错
1.分区’P11’的分区界限过高。



原因分析:出现这个情况是建表分区时P11的下一个分区出现了问题。

一般是分区的数值与其他分区重合,造成了分区界限过高的报错。

处理办法:重新修改子分区的数值界限,值域不能交叉。容易出现在以时间范围分区中。

2.插入分区的关键字未映射到任何分区。



原因分析:出现这个报错是在录入数据时出现的,插入的数据未与分区对应到,造成一些数据无法录入。

举例这个分区是分了3个分区:10部门,20部门,30 部门。在插入的数据中还有40部门的数据,所以造成了这个报错。

解决办法:加入一个相应的子分区。

注:在进行分区操作之前,先备份数据,如果一旦有错误的分区操作可能会导致数据丢失。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_63021300/article/details/132267190

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论