非分区表
分区表
从图片可以形象的看出,分区表把一张大表分成了一个个小表,从而提高查询效率。
问题来了,什么时候考虑对表进行分区操作?
oracle官方给出了3种情况:
1 超过2gb 的表应考虑进行分区;
2 含有历史数据的表,尤其是历史数据很少更新,新数据插入新的分区,历史数据存放在老分区这种情况;
3 当表的内容需要分散在不同存储设备上时;
那么,oracle里面如何进行表分区呢?
1 表分区的类型
从类型上说,主要有range, hash, list 这几种分区方式。
案例展示:
-- 先建表
SQL> create table table1
2 (
3 id varchar(12) not null,
4 time_ date not null,
5 primary key (id)
6 )
7 partition by range (time_)
8 (
9 partition p_table1_2020 values less than ( to_date('2021-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN' ) ),
10 partition p_table1_2021 values less than ( to_date('2022-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN' ) ),
11 partition p_table1_2022 values less than ( to_date('2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN' ) )
12 );
Table created.
复制
-- 插入数据
SQL> insert into table1 values(1000,to_date('2020-07-01 10:31:01','SYYYY-MM-DD HH24:MI:SS'));
1 row created.
SQL> SQL> insert into table1 values(1001,to_date('2021-09-01 10:31:01','SYYYY-MM-DD HH24:MI:SS'));
1 row created.
SQL> select * from table1;
ID TIME_
------------ ---------
1000 01-JUL-20
1001 01-SEP-21
复制
-- 查看各分区数据
SQL> select * from table1 partition (p_table1_2020);
ID TIME_
------------ ---------
1000 01-JUL-20
SQL> select * from table1 partition (p_table1_2021);
ID TIME_
------------ ---------
1001 01-SEP-21
SQL> select * from table1 partition (p_table1_2022);
no rows selected
复制
前面插入的2条数据按照我们制定的分区规则分别进入了分区p_table1_2020 和分区p_table1_2021,而p_table1_2022分区则无数据,符合预期。
2 表分区相关操作
ADD PARTITION | SUBPARTITION
COALESCE PARTITION | SUBPARTITION
DROP PARTITION | SUBPARTITION
EXCHANGE PARTITION | SUBPARTITION
MERGE PARTITION | SUBPARTITION
MOVE PARTITION | SUBPARTITION
SPLIT PARTITION | SUBPARTITION
TRUNCATE PARTITION | SUBPARTITION
复制
已add partition 为例,操作如下:
SQL> alter table table1 add partition p_table1_max values less than ( (to_date('2099-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS') ) );
Table altered.
复制
这样,一个新的分区就添加好了。
我们验证一下:
SQL> select table_owner,table_name,partition_name,high_value,partition_position
2 from dba_TAB_partitions where table_owner='HR' and table_name ='TABLE1';
TABLE_OWNER TABLE_NAME PARTITION_NAME HIGH_VALUE PARTITION_POSITION
--------------- ------------ --------------- -------------------------------------------------- ------------------
HR TABLE1 P_TABLE1_2020 TO_DATE(' 2021-01-01 00:00:00', 'SYYYY-MM-DD HH24: 1
MI:SS', 'NLS_CALENDAR=GREGORIA
HR TABLE1 P_TABLE1_2021 TO_DATE(' 2022-01-01 00:00:00', 'SYYYY-MM-DD HH24: 2
MI:SS', 'NLS_CALENDAR=GREGORIA
HR TABLE1 P_TABLE1_2022 TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24: 3
MI:SS', 'NLS_CALENDAR=GREGORIA
HR TABLE1 P_TABLE1_MAX TO_DATE(' 2099-01-01 00:00:00', 'SYYYY-MM-DD HH24: 4
MI:SS', 'NLS_CALENDAR=GREGORIA
复制
P_TABLE1_MAX 分区已经显示出来了。
当然,从plsql 里面也可以查看
好了,今天的分享就到这里了,亲,你学会了么?
Jan.3, 2021
文章转载自数据库之美,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
796次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
666次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
597次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
550次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
535次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
510次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
502次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
472次阅读
2025-04-17 09:30:30
OR+DBLINK的关联SQL优化思路
布衣
384次阅读
2025-05-05 19:28:36
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
383次阅读
2025-04-15 14:48:05