【SQL应知应会】表分区(四)• Oracle版

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

分区表 • Oracle版

  • 前言
  • 一、分区表
  • 1.什么是表分区
  • 2.创建分区表
    • 2.1 创建范围分区表
    • 2.2 创建列表分区表
    • 2.3 创建散列分区表
    • 2.4 创建复合分区表
  • 3.表分区操作
    • 3.1 创建`range-list`分区
    • 3.2查看分区
    • 3.3查看子分区
    • 3.4 添加分区
    • 3.5 添加子分区
    • 3.6 截断表分区
    • 3.7合并或拆分表分区
      • 3.7.1拆分分区
      • 3.7.2 合并分区
    • 3.8 删除分区
  • 4.分区模板
    • 4.1 对于分区而言,更好的做法就是使用分区模板
    • 4.2 查看分区
    • 4.3添加分区
    • 4.4 分区模板的好处与弊端
  • 小结

前言

✅对于表分区这块内容,我们在MySQL方面已经有五篇内容了,大家可以去我的专栏SQL应知应会进行学习
前面也有过Oracle的表分区的开篇和表分区(二)• Oracle版、【SQL应知应会】表分区(三)• Oracle版了
今天这篇内容继续Oracle的表分区,将Oracle的表分区完结
✳️今天这篇主要讲了表分区的一些操作,如合并和拆分表分区,删除表分区,其实今天的重点分区模板
✴️如果大家学习过前面MySQL的表分区的话,那么对于今天的内容是很轻松就可以学会的,当然,这并没有严格的学习顺序的安排,只是对于MySQL的表分区,我花了大量的篇幅进行学习,大家可以根据自己的学习情况进行随意的选择学习顺序(无需有过多的顾虑)
希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持
那么,快拿出你的电脑,跟着文章一起学习起来吧

一、分区表

1.什么是表分区

:传送门什么是表分区

1.1 分区的意义
1.2 分区的作用
1.3 表分区的方法

2.创建分区表

2.1 创建范围分区表

:传送门创建范围分区表

2.1.1 基本语法
2.1.2 示例

2.2 创建列表分区表

:传送门创建列表分区表

2.2.1 基本语法
2.2.2 示例

2.3 创建散列分区表

:传送门创建散列分区表

2.3.1 基本语法
2.3.2 示例1
2.3.2 示例2

2.4 创建复合分区表

:传送门创建复合分区表

2.4.1 示例1 范围-列表复合分区
2.4.3 示例2 范围-散列复合分区

3.表分区操作

:传送门3.1~3.6

3.1 创建range-list分区

3.2查看分区

3.3查看子分区

3.4 添加分区

3.4.1 添加主分区不带子分区
3.4.2 添加主分区时将子分区带上

3.5 添加子分区

3.6 截断表分区

:传送门3.1~3.6

3.7合并或拆分表分区

3.7.1拆分分区

  • split用于拆分范围分区,拆的时候如果没有定义子分区,系统会自动给子分区一个名字(见下图)
alter table test_range_list_only split partition partrage_201102 at(201102) into(
partition partrage_201101,
partition partrage_201102
)

# 有些分区是没有办法拆分的
## 例如分区partrage_201104
### 分区partrage_201104是小于201105月份分区,但是前面已经有partrage_201103(小于201104月份分区,所以partrage_201104分区里其实是201104月份,无法将201104月份再拆成两个月)

【SQL应知应会】表分区(四)• Oracle版_第1张图片

3.7.2 合并分区

alter table test_range_list_only merge partitions partrage_201101,partrage_201102 into partition partrage_201102 ;

【SQL应知应会】表分区(四)• Oracle版_第2张图片

3.8 删除分区

alter table test_range_list_only drop partition partrage_201102
  • 如果只剩下一个分区,是无法靠上述命令删除的,会出现报错ORA-14083:无法删除分区表的唯一分区

【SQL应知应会】表分区(四)• Oracle版_第3张图片

  • 想彻底删除分区就直接删除表,不然n个分区最多只能删除n-1个
drop table test_range_list_only purge; -- 想彻底删除分区就直接删除表,不然n个分区最多只能删除n-1个

4.分区模板

4.1 对于分区而言,更好的做法就是使用分区模板

create table test_partition(
       month_id varchar2(6),
       prov_id varchar2(20),
       imei varchar2(50),
       use_rat_flag varchar2(20)
       )
partition by range(month_id)
subpartition by list(prov_id)
subpartition template(
       subpartition subpart010 values('010'),
       subpartition subpart011 values('011'),
       subpartition subpart013 values('013'),
       subpartition subpart017 values('017'),
       subpartition subpart018 values('018'),
       subpartition subpart019 values('019'),
       subpartition subpart030 values('030'),
       subpartition subpart031 values('031'),
       subpartition subpart034 values('034'),
       subpartition subpart036 values('036'),
       subpartition subpart038 values('038'),       
       subpartition subpart050 values('050'),
       subpartition subpart051 values('051'),
       subpartition subpart059 values('059'),
       subpartition subpart070 values('070'),
       subpartition subpart071 values('071'),
       subpartition subpart074 values('074'),
       subpartition subpart075 values('075'),
       subpartition subpart076 values('076'),
       subpartition subpart079 values('079'),
       subpartition subpart081 values('081'),
       subpartition subpart083 values('083'),
       subpartition subpart084 values('084'),
       subpartition subpart085 values('085'),
       subpartition subpart086 values('086'),
       subpartition subpart087 values('087'),
       subpartition subpart088 values('088'),
       subpartition subpart089 values('089'),
       subpartition subpart090 values('090'),
       subpartition subpart091 values('091'),
       subpartition subpart097 values('097'),
       subpartition subpartdefault values(default)
       )
(      
       partition part201606 values less than ('201607')
       pctfree 0 pctused 40 initrans 1 maxtrans 255
       storage(
               buffer_pool default flash_cache default cell_flash_cache default)
       compress basic nologging);
       
# pctfree 0 pctused 40 initrans 1 maxtrans 255: 这部分是用于指定表中的数据块的管理参数

## pctfree: 空闲区域占用每个数据块的百分比。在此示例中,0 表示没有空闲区域。
## pctused: 数据块中至少被使用的百分比。在此示例中,40 表示数据块中至少需要被使用 40%。
## initrans: 表级别事务槽数,初始化时每个数据块的最大事务槽数。在此示例中,为 1。
## maxtrans: 最大事务槽数,数据块上的最大活动事务槽数。在此示例中,为 255。

# storage (...): 这部分是用于指定表的存储参数
## 在此示例中,采用了默认的存储参数
## 这些参数包括缓冲池 (buffer_pool)、闪存缓存 (flash_cache) 和单元闪存缓存 (cell_flash_cache)。

# compress basic: 这部分指定了表的压缩选项。在此示例中,采用了基本压缩。

# nologging: 这部分指定了在表上执行的插入操作不记录日志。

4.2 查看分区

【SQL应知应会】表分区(四)• Oracle版_第4张图片
【SQL应知应会】表分区(四)• Oracle版_第5张图片

4.3添加分区

  • 前面的案例是每个子分区名称都不一样,如果像这个分区模板的案例,主分区中所有的子分区名称都是固定的,那么只需要每次add主分区就可以,会自动带上子分区
alter table test_partition add partition part201607 values less than ('201608')

【SQL应知应会】表分区(四)• Oracle版_第6张图片

4.4 分区模板的好处与弊端

  • 分区模板的好处:子分区前置,每次添加主分区,会自动带上子分区
  • 分区模板的弊端:不同主分区中的子分区的名称是一样的,但是它会产生唯一的子分区实例,自动拼接子分区名称(见上图)

在标题3.4中的创建表分区方式,就不能通过子分区模板去创建了,因为每个子分区定义的时候都不一样,这种是先定义了主分区,后定义了子分区

而子分区模板是先定义子分区,后定义主分区,不同的主分区中的子分区的名字是统一的

但是标题3.4中的创建方式有一个好处,就是每次都可以直观的看到子分区的名字,而子分区模板的子分区名字需要在系统表中查询

小结

感谢大家耐心的看完这篇文章,这篇文章是Oracle的表分区的第4篇文章,也是本专栏关于Oracle表分区的最后一篇文章,对于SQL在表分区的知识点,我们在MySQL方面已经有五篇内容了,大家可以去我的专栏SQL应知应会 进行学习,如果大家觉着还算可以,那么就给个三连支持一下吧
也可以加入我的社区一起学习呀
✅如果想要继续关注和学习后续更多的内容,那就关注一下爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我

请添加图片描述

你可能感兴趣的:(SQL应知应会,sql,oracle,数据库,mysql,大数据,面试)