(一)什么是分区

所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区。

(二)分区的优势

  • 提高数据可管理性。对表进行分区,数据的加载、索引的创建与重建、数据的备份与恢复等操作都可以在分区表上进行,而不必在表级别上进行,提高了数据的可管理性;
  • 增强数据库的可用性。某个分区出现问题,只影响该分区,其它分区照常运作;
  • 改善查询性能。将对整个表的查询转化为对某个分区表的查询,提高了查询速度;
  • 提高数据库操作的并行性。可对分区表进行并行操作;
  • 透明性。将一张表分区后,对于用户而言是无感的,即用户不会感知到有多个分区表的存在,用户不需要对SQL语句做处理;

(三)什么时候需要分区

什么时候对表进行分区,我们可以从下面的条件进行考虑:

  • 表大于2G;
  • 对一个表并行进行DML操作;
  • 为了平衡硬盘I/O,需将同一个表分区到不同的表空间,必须对表进行分区;
  • 要将表的一部分设为只读状态,另一部分设为读写状态,需要对表进行分区;
  • 要将表一部分设为可用状态,另一部分设为不可用状态,需要队标进行分区;
  • 要将表中数据按照一定规则分散到不同的磁盘中去,需要对表进行分区;

(四)分区方法

oracle数据库提供了3种分区方法:范围分区(Range Partitioning)、列表分区(List Partitioning)和散列分区(Hash Partitioning),结合3种方法,又可以进行复合分区。

(1)范围分区(Range Partitioning)

范围分区是根据分区列值的范围对表进行分区,每条记录根据分区列值的范围分配到不同的分区表中。常用于按照日期分区的表。

(2)列表分区(List Partitioning)

如果分区列值的并不能划分范围(非数值或日期类型),但是分区列的值仅包含少数值,可采用分区列,将特定的值保存到分区中。例如,要统计整个省的人口信息,如果将全部信息放在一张表中,那么表将会非常臃肿,这时候我们可以考虑按照列表分区,将人口信息按照市分配到多个分区表中。

(3)散列分区(Hash Partitioning)

基于分区列的哈希算法,将数据均匀分不到指定的分区中,一个记录分配到哪个分区中是由Hash函数决定的。

(4)复合分区(Composite Partitioning)

复合分区是结合两种基本分区方法,先采用一种分区方法进行分区,然后再采用另一种方法进行分区。

(五)创建分区表

(1)创建范围分区表

CREATE TABLE table_name (...)
PARTITION BY RANGE(column1 [,column2,...])
(
PARTITION partition1 VALUES LESS THAN(literal | MAXVALUE)
[TABLESPACE tablespace]
PARTITION partition2 VALUES LESS THAN(literal | MAXVALUE)
[TABLESPACE tablespace]
[PARTITION partition3 VALUES LESS THAN(iteral | MAXVALUE)
[TABLESPACE tablespace]]
)

参数说明:

PARTITION BY RANGE:采用范围分区;

column:分区列,可以是单列,也可以是多列;

PARTITION:分区设置;

VALUE LESS THAN:分区上限;

TABLESPACE:分区表存储的表空间

例子1:创建一个销售分区表,按照季度进行分区

create table sale_by_range
(
prod_id number,
cust_id number,
time_id date,
channel_id char(1),
promo_id number(6),
quantity_sold number(3),
amount_sold number
)
partition by range(time_id)
(
partition sales_q1_2012 values less than(to_date('1-4-2012','dd-mm-yyyy')) tablespace TBS1,
partition sales_q2_2012 values less than(to_date('1-7-2012','dd-mm-yyyy')) tablespace TBS2,
partition sales_q3_2012 values less than(to_date('1-10-2012','dd-mm-yyyy')) tablespace TBS3,
partition sales_q4_2012 values less than(to_date('1-1-2013','dd-mm-yyyy')) tablespace TBS4
)

结果如下:

插入数据,发现没有问题

insert into sale_by_range(prod_id,cust_id,time_id,quantity_sold)
values(2,12,to_date('2012-04-01','yyyy-mm-dd'),103);

结果如下:

PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
         2         12 01-4月-12                                  103

(2)创建列表分区表

通过使用带PARTITION BY LIST子句的CREATE TABLE来创建列表分区表:

CREATE TABLE table_name(...)
PARTITION BY LIST(column)
(
PARTITION partition1 VALUES([literal|NULL]|[DEFAULT])
TABLESPACE tablespace_name,
[,
PARTITION partition2 VALUES([literal|NULL]|[DEFAULT]),
TABLESPACE tablespace_name
...]
);

参数说明:

PARTITION BY LIST:采用列表分区;

DEFAULT:如果列值不符合其它分区记录的要求,保存在该分区表;

例子2:创建一个销售分区表,按照地区进行分区

--创建一个销售分区表,按照地区进行分区
create table sales_by_list
(
dept number,
deptname varchar(20),
quarterly_sales number(10,2),
province varchar(20)
)
partition by list(province)
(
partition southeast values('guangdong','fujian') tablespace TBS1, --广东、福建的存放在southeast分区表
partition northeast values('heilongjiang','liaoning','jilin') tablespace TBS2, --黑龙江、辽宁、吉林放在northeast分区表
partition southwest values('sichuan','yunnan','guizhou') tablespace TBS3, --四川、云南、贵州放在southwest分区表
partition otherprovince values(default) tablespace TBS4 --其他省的放在otherprivince分区表
)

插入数据:

--插入数据
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(1,'fa',2000,'sichuan');
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(2,'cim',4000,'guangdong');
insert into sales_by_list(dept,quarterly_sales,province) values(3,6000,'liaoning');
insert into sales_by_list(dept,deptname,quarterly_sales,province) values(4,'cell',8000,'hunan');
insert into sales_by_list(dept,deptname) values(5,'model')

查看数据:

SQL> select * from sales_by_list;

      DEPT DEPTNAME             QUARTERLY_SALES PROVINCE
---------- -------------------- --------------- --------------------
2 cim 4000 guangdong
3 6000 liaoning
1 fa 2000 sichuan
4 cell 8000 hunan
5 model

(3)创建散列分区表

通过创建PARTITION BY HASH子句的CREATE TABLE语句创建散列分区表:

CREATE TABLE table_name(...)
PARTITION BY HASH(column1[,column2,...])
[([PARTITION partition [TABLESPACE tablespace] [,...])] --设置分区表名称及对应表空间
|
[PARTITION hash_parttition_quantity STORE IN([tablespace1[,...])] --设置分区数量及存储表空间
]

说明:

HASH分区有2种方式来决定分区的数量,一种是通过设置分区表的名称来决定分区的数量,一种是直接设置分区的数量。

例子3:通过直接设置分区的数量来创建HASH分区表

--创建一个HASH分区表
create table dept_by_hash
(
dept number,
deptname varchar(20),
quarterly_sales number(20),
province varchar(20)
)
partition by hash(dept)
partitions 4 store in(TBS1,TBS2,TBS3,TBS4); --需要注意的是,创建分区时不需要小括号

数据的插入与上面2种方法一样,这里不做讨论。

(4)创建复合分区表

Oracle 11g支持的6种复合分区方法:

  • Range-Range
  • Range-List
  • Range-Hash
  • List-Range
  • List-List
  • List-Hash

为什么不以Hash开头?通过Hash分区的方式可知,Hash分区是将数据均匀的分配到其分区表中,它不关心数据内容,所以,先以Hash分,然后再用其它方式,显然没有意义。

创建符合分区时,首先在CREATE TABLE语句中使用PARTITION BY [RANGE|LIST]子句确定分区方法、分区列,然后再使用SUBPARTITION BY [RANGE|LIST|HASH]子句指定分区的分区方法、分区列、分区数量等信息。

例子4.创建一个分区列表,将2012年的销售记录先按季度进行范围分区,再按区域进行列表分区

--创建一个分区列表,将2012年的销售记录先按季度进行范围分区,再按区域进行列表分区
create table sales_by_range_list
(
dept number,
deptname varchar(20),
time_id date,
quarterly_sales number(10,2),
province varchar(20)
)
partition by range(time_id)
subpartition by list(province)
(
partition sales_q1_2012 values less than(to_date('1-4-2012','dd-mm-yyyy')) tablespace TBS1 --第一季度销售情况
(
SUBPARTITION sales_q1_2012_southeast VALUES ('guangdong', 'fujian'), --广东、福建的存放在southeast分区表
SUBPARTITION sales_q1_2012_northeast VALUES ('heilongjiang', 'liaoning', 'jilin'), --黑龙江、辽宁、吉林放在northeast分区表
SUBPARTITION sales_q1_2012_southwest VALUES ('sichuan', 'yunnan', 'guizhou'), --四川、云南、贵州放在southwest分区表
SUBPARTITION sales_q1_2012_otherprovince VALUES ( DEFAULT ) --其他省的放在otherprivince分区表
),
partition sales_q2_2012 values less than(to_date('1-7-2012','dd-mm-yyyy')) --第二季度销售情况
(
subpartition sales_q2_2012_southeast values('guangdong','fujian'),
subpartition sales_q2_2012_northeast values('heilongjiang','liaoning','jilin'),
subpartition sales_q2_2012_southwest values('sichuan','yunnan','guizhou'),
subpartition sales_q2_2012_otherprovince values(default)
),
partition sales_q3_2012 values less than(to_date('1-10-2012','dd-mm-yyyy')) --第三季度销售情况
(
subpartition sales_q3_2012_southeast values('guangdong','fujian'),
subpartition sales_q3_2012_northeast values('heilongjiang','liaoning','jilin'),
subpartition sales_q3_2012_southwest values('sichuan','yunnan','guizhou'),
subpartition sales_q3_2012_otherprovince values(default)
),
partition sales_q4_2012 values less than(MAXVALUE) --第四季度销售情况
(
subpartition sales_q4_2012_southeast values('guangdong','fujian'),
subpartition sales_q4_2012_northeast values('heilongjiang','liaoning','jilin'),
subpartition sales_q4_2012_southwest values('sichuan','yunnan','guizhou'),
subpartition sales_q4_2012_otherprovince values(default)
)
)

向表中插入数据,

--向表中插入数据
insert into sales_by_range_list values(1,'a1',to_date('2012-1-2','yyyy-mm-dd'),1000,'guangdong'); --模拟一季度四个地区的数据
insert into sales_by_range_list values(2,'a1',to_date('2012-2-6','yyyy-mm-dd'),1000,'heilongjiang');
insert into sales_by_range_list values(3,'a1',to_date('2012-2-28','yyyy-mm-dd'),1000,'guizhou');
insert into sales_by_range_list values(4,'a1',to_date('2012-3-4','yyyy-mm-dd'),1000,'gansu');
insert into sales_by_range_list values(5,'a1',to_date('2012-4-6','yyyy-mm-dd'),1000,'fujian'); --模拟二季度四个地区的数据
insert into sales_by_range_list values(6,'a1',to_date('2012-5-6','yyyy-mm-dd'),1000,'jilin');
insert into sales_by_range_list values(7,'a1',to_date('2012-5-28','yyyy-mm-dd'),1000,'yunnan');
insert into sales_by_range_list values(8,'a1',to_date('2012-6-6','yyyy-mm-dd'),1000,'xizang');
insert into sales_by_range_list values(9,'a1',to_date('2012-7-6','yyyy-mm-dd'),1000,'guangdong'); --模拟三季度四个地区的数据
insert into sales_by_range_list values(10,'a1',to_date('2012-8-6','yyyy-mm-dd'),1000,'heilongjiang');
insert into sales_by_range_list values(11,'a1',to_date('2012-9-6','yyyy-mm-dd'),1000,'guizhou');
insert into sales_by_range_list values(12,'a1',to_date('2012-9-25','yyyy-mm-dd'),1000,'gansu');
insert into sales_by_range_list values(13,'a1',to_date('2012-10-6','yyyy-mm-dd'),1000,'fujian'); --模拟四季度四个地区的数据
insert into sales_by_range_list values(14,'a1',to_date('2012-11-6','yyyy-mm-dd'),1000,'jilin');
insert into sales_by_range_list values(15,'a1',to_date('2012-12-6','yyyy-mm-dd'),1000,'yunnan');
insert into sales_by_range_list values(16,'a1',to_date('2012-12-26','yyyy-mm-dd'),1000,'xizang');

可以看到结果:

(六)查看分区表

(1)查看分区表信息

可以通过DBA_PART_TABLES、ALL_PART_TABLES、USER_PART_TABLES来查看分区表信息,具体用法如下:

  • DBA_PART_TABLES:查看数据库里面的全部分区表信息,需要具有DBA权限,否则会报“ora-00942: 表或视图不存在”错误;
  • ALL_PART_TABLES:查看当前用户可见的全部分区表信息;
  • USER_PART_TABLES:查看当前用户拥有的全部分区表信息;

例子5:查看当前用户拥有的的全部分区表信息

select * from user_part_tables;

重要参数说明:

TABLE_NAME:分区表名称;

PARTITION_TYPE:分区类型;

SUBPARTITION_TYPE:子分区类型;

PARTITION_COUNT:分区数量;

SUBPARTITION_KEY_COUNT:子分区用于分区的列的数量。

通过上面的查询,我们可以得到:分区表名称、分区数量、子分区数量等信息,但是并没有得到分区/子分区的名称,以及分区/子分区是如何定义等信息,接下来可以使用USER_TAB_PARTITION和USER_TAB_SUBPARTITION查看分区表/子分区表信息:

--查询分区表信息
SELECT * FROM USER_TAB_PARTITIONS;

--查询子分区表信息
SELECT * FROM USER_TAB_SUBPARTITIONS;

(2)查看分区表数据

在向分区表插入数据时,我们最关心的就是数据是否按照我们的规划进入了各个分区表,这时,就需要我们查看分区表的数据,那么,怎么查看分区表的数据,通过sql语句:

SELECT * FROM table_name PARTITION(partition_table_name)

例子6.查看SALES_BY_LIST_RANGE分区表第一季度的信息

select * from SALES_BY_RANGE_LIST partition(sales_q1_2012);

得到结果:

(七)维护分区表

(1)添加分区

ALTER TABLE table_name ADD PARTITION ...        --添加分区

ALTER TABLE table_name MODIFY PARTITION partition ADD SUBPARTITION ...    --为分区添加子分区

(2)删除分区

ALTER TABLE table_name DROP PARTITION partition;        --删除分区

ALTER TABLE table_name DROP SUBPARTITION subpartition;    --删除子分区

(3)其他

此外,还有联合分区、交换分区、合并分区等操作,不一一介绍。

(八)与分区相关的数据字典

数据字典 说明
xxx_PART_TABLES 包含分区表的分区信息
xxx_TAB_PARTITIONS 包含分区层次、分区存储、分区统计等信息
xxx_TAB_SUBPARTITIONS 包含子分区层次、分区存储、分区统计等信息
xxx_PART_KEY_COLUMNS 包含分区表的分区列信息
xxx_SUBPART_KEY_COLUMNS 包含子分区表的分区列信息
xxx_COL_STATISTICS 包含分区表的分区列的统计信息和柱状图信息
xxx:代表DBA、ALL、USER  

对分区表有了一定的了解,接下来学习分区索引。

[oracle]分区表学习的更多相关文章

  1. Oracle分区表学习

    (1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应 ...

  2. 深入学习Oracle分区表及分区索引

    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Has ...

  3. 【三思笔记】 全面学习Oracle分区表及分区索引

    [三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...

  4. Oracle DBA 学习总结

    对于学习Oracle 数据库,应该先要了解Oracle 的框架.它有物理结构(由控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件组成) ,逻辑结构(表空间.段.区.块),内存分配( SG ...

  5. 谈一下如何设计Oracle 分区表

    在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,所有数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...

  6. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  7. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

  8. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  9. 谈一下怎样设计Oracle 分区表

    在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...

随机推荐

  1. 【Shell】按行读取文件内容

    方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done < ...

  2. javaweb九大个内置对象,四大域

    9个内置对象如下: 1.session对象:会话对象 当客户端第一次访问服务器的页面时,web服务器会自动为该客户端创建一个session对象并分配一个唯一的id号 常常用它来在多个页面间共享数据,如 ...

  3. C# Attribute应用:类签名

    在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的.通过对Attribute的学习了解.大体可以用Attribute来做签名应用. 具体过程如下: 首先我们要先定义一个类,该类继承At ...

  4. Java中的锁之乐观锁与悲观锁

    1.  分类一:乐观锁与悲观锁 a)悲观锁:认为其他线程会干扰本身线程操作,所以加锁 i.具体表现形式:synchronized关键字和lock实现类 b)乐观锁:认为没有其他线程会影响本身线程操作, ...

  5. oracle 常用操作记录--持续更新...

    一.oracle grant 授权语句(转自:https://www.cnblogs.com/yt954437595/p/6488819.html) --select * from dba_users ...

  6. 对HTML的大致了解

    HTML的全称是Hyper Text Markup Language(超文本标记语言),是一种标记语言.其中,HTML文档一个重要的.广泛使用的标准HTML4.01是在1999年12月24日由W3C组 ...

  7. SharePoint 2013 - System Features

    1. Embed Information & Convert to PDF 功能,在文档的preview界面(hover panel); 2. Share功能可以选择是否发送邮件 -- Don ...

  8. CNN 和RNN 中input 长度不一致问题

    转自:https://www.jianshu.com/p/86d667ee3c62,感谢分享! pad_sequences & Masking layer 上面提到,文本数据也可以用CNN来处 ...

  9. 订阅无法在 ARM 模式下创建虚拟机,只能在 ASM 模式下创建 Azure VM 部署

    问题描述 资源组所有者可以在新版 portal 创建经典模式的虚拟机,但是无法创建 ARM 模式的虚拟机. 问题现象 环境中有个相对权限比较高的账户,比如 account admin (以下简称为 A ...

  10. 团队第三次scrum

    长大一条龙之课表查询 一.设计概要 本次内容主要是实现了长大一条龙系统的课表查询功能,我们的这个项目严格遵守MVC架构,采用前后端分离的策略.我们将课表查询分为二层,DAO层:负责与数据进行交互,读写 ...