Oracle分区表例子
分区表
Oracle提供的分区方法有以下几种。
1.范围分区(range)
范围分区是应用范围比较广的表分区方式,它是以列的值的范围来作为分区的划分条
件,将记录存放到列值所在的 range分区中。
示例 1
需求说明:
在某购物中心销售系统中,要求统计某季度的销售信息。
销售信息表包含如下列:销售流水号、产品 id、销售日期、销售金额、销售区域。
表 1 销售信息表 SALES
列名称 列类型 列说明
SALES_ID NUMBER 销售流水号
PRODUCT_ID VARCHAR2(5) 产品 id
SALES_DATE DATE 销售日期
SALES_COST NUMBER(10) 销售金额
AREACODE VARCHAR2(5) 销售区域
解决方案一:没学过表分区时,根据要求查询的季度找到对应的所有月份,找出相应的
记录,求和汇总来分析。
解决方案二:运用表分区的特性,根据范围分区的概念,按照季度将销售记录表创建为
范围分区表,某一季度的数据就包含在某一个分区中,只查询某一分区的数据就可获得该季
度的销售信息,而不用进行全表的筛选,从而提高数据库性能。
分析:
如按照时间划分,2013年 4月 1日前的数据放到 P1分区,代表第一季度;2013年 7月
1日前的数据放到 P2分区,代表第二季度;2013年 10月 1日前的数据放到 P3分区,代表
第三季度;2014年 1月 1日前的数据放到 P4分区,代表第四季度。在创建的时候,需要指
定基于的列,以及分区的范围值。
提示:
在按时间分区时,如果某些记录暂无法预测范围,可以创建 maxvalue分区,所有不在
指定范围内的记录都会被存储到 maxvalue所在分区中。
关键代码:
CREATE TABLE SALES1
(
1
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY RANGE (SALES_DATE)
(
PARTITION P1 VALUES LESS THAN (to_date('2013-04-1', 'yyyy-mm-dd')),
PARTITION P2 VALUES LESS THAN (to_date('2013-07-1', 'yyyy-mm-dd')),
PARTITION P3 VALUES LESS THAN (to_date('2013-10-1', 'yyyy-mm-dd')),
PARTITION P4 VALUES LESS THAN (to_date('2014-01-1', 'yyyy-mm-dd')),
PARTITION P5 VALUES LESS THAN (maxvalue)
);
要查看在第三季度的数据,请输入以下语句。
SELECT SUM(sales_cost) FROM SALES1 partition(P3);
经验
一般创建范围分区时都会将最后一个分区设置为 maxValue,将其他数据落入
此分区,一旦需要时可以利用拆分分区的技术将需要的数据从最后一个分区分离
出去,单独形成一个分区。如果没有创建最大的分区,插入的数据超出范围就会
报错。
如果插入的数据就是分区键上的值,则该数据落入下一分区。例如插入数据位
‘2013-10-1',则数据会落入 P4 分区。
2.散列分区(hash)
对于那些无法有效划分范围的表,可以使用 hash分区。hash分区会将表中的数据平均
分配到指定的几个分区中,由于数据被平均分配到不同的分区,减少了查询时对数据块的竞
争,这样对于提高性能还是会有一定的帮助。列所在分区是依据分区列的 hash值自动分配,
因此并不能控制,也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖
列。
示例 2
需求说明:
根据散列分区的特性,为了提高数据库的性能,将销售流水号作为分区键创建销售记录
表。
关键代码:
--准备工作,提前创建每个分区的表空间
--创建散列分区表
CREATE TABLE SALES2
2
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY HASH (SALES_ID)
(
PARTITION P1 tablespace tablespace01,
PARTITION P2 tablespace tablespace02,
PARTITION P3 tablespace tablespace03
);
3.列表分区(list)
列表分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像
range或者 hash分区那样同时指定多个列作为分区依赖列,但它的单个分区对应值可以是
多个。
在分区时,必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/
更新就会失败,因此通常建议使用 list分区时,要创建一个 default分区存储那些不在指
定范围内的记录,类似 range分区中的 maxvalue分区。
示例 3
需求说明:
按照销售区域统计销售记录。
分析:
创建列表分区,分区键为销售区域代码列。
提示:
可以指定 default,把非分区规则的数据全部放到 default分区。
关键代码:
CREATE TABLE SALES3
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY LIST(AREACODE)
(
PARTITION t_list025035 VALUES ('025','035'),
PARTITION t_list372 VALUES ('372') ,
PARTITION t_list510 VALUES ('510'),
PARTITION t_other VALUES (default)
3
);
4.复合分区
如果某表按照某列分区之后,仍然较大,或者有一些其他的需求,还可以通过分区内再
建子分区的方式将分区再分区,即组合分区的方式。
组合分区有两种:
范围-哈希(range-hash)复合分区。
范围-列表(range-list)复合分区。
注意顺序,根分区只能是 range分区,子分区可以是 hash分区或 list分区。
示例 4
需求说明:
查找某一季度的销售信息。
分析:
先根据销售日期进行范围分区,再在每个分区内根据销售流水号进行散列分区。
优点:
可以按照范围查找,在每个范围内进行散列分区,提高数据库性能。
关键代码:
CREATE TABLE SALES4
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY RANGE (SALES_DATE)
SUBPARTITION BY HASH(SALES_ID)
SUBPARTITIONS 3 STORE in (tablespace01,tablespace02,tablespace03)
(
PARTITION P1 VALUES LESS THAN (to_date('2013-04-1', 'yyyy-mm-dd')),
PARTITION P2 VALUES LESS THAN (to_date('2013-07-1', 'yyyy-mm-dd')),
PARTITION P3 VALUES LESS THAN (to_date('2013-10-1', 'yyyy-mm-dd')),
PARTITION P4 VALUES LESS THAN (to_date('2014-01-1', 'yyyy-mm-dd')),
PARTITION p5 VALUES LESS THAN (maxvalue)
);
示例 5
需求说明:
4
要求查找某一季度内的某一销售区域的销售信息。
分析:
先根据交易日期进行范围分区,再在每个分区内根据销售区域进行列表分区。
优点:
可以按照范围查找,在每个范围内还可以用列表分区进行细分。
关键代码:
CREATE TABLE SALES5
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY RANGE (SALES_DATE)
SUBPARTITION BY LIST(AREACODE)
(
PARTITION P1 VALUES LESS THAN (to_date('2013-04-1', 'yyyy-mm-dd'))
(SUBPARTITION t1_list025035 VALUES ('025','035'),
SUBPARTITION t1_list372 VALUES ('372') ,
SUBPARTITION t1_list510 VALUES ('510'),
SUBPARTITION t1_other VALUES (default)
),
PARTITION P2 VALUES LESS THAN (to_date('2013-07-1', 'yyyy-mm-dd'))
(SUBPARTITION t2_list025035 VALUES ('025','035'),
SUBPARTITION t2_list372 VALUES ('372') ,
SUBPARTITION t2_list510 VALUES ('510'),
SUBPARTITION t2_other VALUES (default)
),
PARTITION P3 VALUES LESS THAN (to_date('2013-10-1', 'yyyy-mm-dd'))
(SUBPARTITION t3_list025035 VALUES ('025','035'),
SUBPARTITION t3_list372 VALUES ('372') ,
SUBPARTITION t3_list510 VALUES ('510'),
SUBPARTITION t3_other VALUES (default)
),
PARTITION P4 VALUES LESS THAN (to_date('2014-01-1', 'yyyy-mm-dd'))
(SUBPARTITION t4_list025035 VALUES ('025','035'),
SUBPARTITION t4_list372 VALUES ('372') ,
SUBPARTITION t4_list510 VALUES ('510'),
SUBPARTITION t4_other VALUES (default)
),
PARTITION p5 VALUES LESS THAN (maxvalue)
(SUBPARTITION t5_list025035 VALUES ('025','035'),
SUBPARTITION t5_list372 VALUES ('372'),
SUBPARTITION t5_list510 VALUES ('510'),
SUBPARTITION t5_other VALUES (default)
5
)
);
要查看在第三季度并且在销售区域编号为“510”地区的数据,请输入以下语句。
--查复合分区子分区的关键字为 subpartition
SELECT SUM(SALES_COST) FROM SALES5 subpartition(t3_list510);
5.间隔分区(Interval)
Interval分区是 Oracle11g版本新引入的分区方法,使范围分区的一种增强功能,可以
实现范围分区的自动化。
优点为不需要创建表时将所有分区划分清楚,间隔分区随着数据的增加会分配更多的分
区,并自动创建新的分区。
示例 6
需求说明:
参照示例 1,要求统计某季度的销售信息。
关键代码:
--创建间隔分区表
CREATE TABLE SALES5
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5)
)
PARTITION BY RANGE(SALES_DATE)
INTERVAL(NUMTOYMINTERVAL(3,'MONTH'))
(PARTITION P1 VALUES LESS THAN (to_date('2013-04-1','yyyy/mm/dd')));
--插入数据
INSERT INTO sales5 VALUES (1,'a',to_date('2013-08-1'),10,'1');
--获得分区情况
SELECT table_name,partition_name
FROM user_tab_partitions
WHERE table_name=UPPER('sales5');
--查询输出结果,系统自动根据输入数据情况创建新分区“SYS_P82”
TABLE_NAME PARTITION_NAME
----------------------------
SALES5 P1
SALES5 SYS_P82
--查询分区数据
SELECT * FROM sales5 PARTITION(sys_P82);
说明:
6
(1)只需创建第一个开始分区,如上例中 P1。
(2)INTERVAL(NUMTOYMINTERVAL(3,'MONTH'))语句含义。其中 INTERVAL代表“间隔”,
按照后面括号中的定义间隔添加分区;
(3)NUMTOYMINTERVAL(3,'MONTH')函数的意思为每 3个月为一个分区。
NUMTOYMINTERVAL(n, 'interval_unit') 函数
将 n转换成 interval_unit所指定的值,
interval_unit可以为: YEAR, MONTH
举例:NUMTOYMINTERVAL(1,'YEAR'):每 1年为一个分区;
NUMTOYMINTERVAL(1,'MONTH'):每 1个月为一个分区;
与该类型相关的函数还有:
NUMTODSINTERVAL(n, 'interval_unit')
将 n转换成 interval_unit所指定的值,
interval_unit可以为: DAY, HOUR, MINUTE, SECOND
注意该函数不可以转换成 YEAR和 MONTH的.
(4)系统会根据数据自动创建分区。
经验
可以利用间隔分区将开始创建时没有分区的表创建为间隔分区表。例如
CREATE TABLE SALES5
PARTITION BY RANGE(SALES_DATE)
INTERVAL(NUMTOYMINTERVAL(3,'MONTH'))
(PARTITION P1 VALUES LESS THAN (to_date('2013-04-1','yyyy/mm/dd')))
AS SELECT * FROM SALES; --SALES表为已经创建的表
6.虚拟列分区
在之前的 Oracle版本中,只有分区键存在于表中才可以对该表实施分区操作。Oracle11g
新功能“虚拟列分区” 打破了这一限制,允许虚拟列作为分区建。
下面是一个创建虚拟列的表的例子。
示例 7
需求说明:
创建销售纪录分区表,根据销售区域编码前 2位创建一个虚拟列为销售部门列。以销售
部门列作为分区建。
分析:
7
获得销售区域编码前 2位代码:
to_number(SUBSTR(to_char(AREACODE),1,2))
创建销售部门列代码:
AREA_Branch NUMBER(2) GENERATED ALWAYS AS
(to_number(SUBSTR(to_char(AREACODE),1,2)))
关键代码:
CREATE TABLE SALES6
(
SALES_ID NUMBER,
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER(10),
AREACODE VARCHAR2(5),
AREA_Branch NUMBER(2) GENERATED ALWAYS AS
(to_number(SUBSTR(to_char(AREACODE),1,2)))
)
PARTITION BY LIST(AREA_Branch)
(
PARTITION t_list10 VALUES (10),
PARTITION t_list11 VALUES (11) ,
PARTITION t_list12 VALUES (12),
PARTITION t_other VALUES (default)
);
--插入数据
INSERT INTO sales6(SALES_ID,PRODUCT_ID,SALES_DATE, SALES_COST,AREACODE) VALUES
(1,'a',to_date('2013-08-1'),10,'1012');
--查询数据
select * FROM sales6 PARTITION (t_list10);
说明:
(1)虚拟列是不能插入数据的,虚拟列是通过其他列或者其他虚拟列计算出来的。
Oracle分区表例子的更多相关文章
- 深入学习Oracle分区表及分区索引
关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: • Range(范围)分区 • Has ...
- oracle 分区表和分区索引
很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...
- ORACLE分区表、分区索引详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...
- 【三思笔记】 全面学习Oracle分区表及分区索引
[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...
- ORACLE分区表操作
ORACLE分区表的操作应用 摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用. 在大型的企业应用或企业级的数据库应用中,要处理的数据 ...
- 03 Oracle分区表
Oracle分区表 先说句题外话… 欢迎成都天府软件园的小伙伴来面基交流经验~ 一:什么是分区(Partition)? 分区是将一个表或索引物理地分解为多个更小.更可管理的部分. 分区对应用透 ...
- oracle分区表有什么作用
oracle分区表有什么作用 https://zhidao.baidu.com/question/1818955865408544348.html (1) 表空间及分区表的概念 表空间: 是一个或多个 ...
- 性能-发挥ORACLE分区表
ORACLE分区表发挥性能 http://www.cnblogs.com/zwl715/p/3962837.html 1.1 分区表PARTITION table 在ORACLE里如果遇到特别大的表, ...
- oracle 跨分区查询效率,Oracle分区表做跨分区查询
问:有一张大表,其中按时间字段(TIME_ID)进行表分区(按季度分区),但是如果业务人员做跨季度的大批量数据的查询时,未能走TIME_ID分区索引,导致全表扫描.此种情况该如何处理? 示例解析: 1 ...
随机推荐
- NPOI解析Excel
园子的文章: http://www.cnblogs.com/csqb-511612371/category/654604.html 关键就是如何解析Excel表头,特别是合并单元格的..还有对应NPO ...
- Java类加载机制?
深入研究Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比 ...
- (6)servlet-创建一个servlet类
1,在项目的src目录下,右键[New]-[Servlet] 2,在弹出窗口中填写信息 Package:所在包名 Name:servlet的类名 Which method stubs would yo ...
- spring boot 使用过滤器
//启动类添加注解@ServletComponentScan package com.baiwang.invoice.utils; import java.io.IOException; import ...
- BZOJ2002:Bounce 弹飞绵羊(LCT)
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...
- Watir: 很久以前,对Watir开始学习时候做的笔记
1). buttons Xpath 1)Button properties browser.button(:xpath,"//input[@id='b2']/").name bro ...
- Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化
ylbtech-Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化 1.返回顶部 1. Java 实例 - 字符串优化 Java 实例 以下实例演示了通过 Str ...
- 杂项-Java:JBoss
ylbtech-杂项-Java:JBoss 是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用.JBoss是一个管理EJB的容器和服务器,支持E ...
- Html.PartialView(),html.Renderpartial,html.action.html.RenderAction 辅助方法
Html.Partial(), 返回HTML字符串 .参数为部分视图 html.RenderPartial(),不返回返回HTML字符串 ,直接输出响应流.参数为部分视图 一般用于主视图中已经存在了这 ...
- Python科学计算工具包
import numpy as np # 创建一个Ndarray # 1. 从list对象中创建 # 2. 创建一个特定的数组,全1数组ones,随机数组random.randn,对角矩阵diag # ...