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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




