分享知识-快乐自己:oracle表分区详解
从以下几个方面来整理关于分区表的概念及操作:
1)表空间及分区表的概念:
2)表分区的具体作用:
3)表分区的优缺点:
4)表分区的几种类型及操作方法:
5)对表分区的维护性操作:
1):表空间及分区表的概念
表空间:
是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。
分区表:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。
表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
2):表分区的具体作用:
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。从数据库 管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但 是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。
什么时候使用分区表:
1)表的大小超过2GB。
2)表中包含历史数据,新的数据被增加都新的分区中。
3):表分区的优缺点
优点:
1)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4)均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
4):表分区的几种类型及操作方法
1)范围分区:
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。
当使用范围分区时,请考虑以下几个规则:
1):每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
2):所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
3):在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。
例1:
假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:
- CREATE TABLE CUSTOMER
- (
- CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
- FIRST_NAME VARCHAR2(30) NOT NULL,
- LAST_NAME VARCHAR2(30) NOT NULL,
- PHONE VARCHAR2(15) NOT NULL,
- EMAIL VARCHAR2(80),
- STATUS CHAR(1)
- )
- PARTITION BY RANGE (CUSTOMER_ID)
- (
- PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
- PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
- )
提示:一定要同时执行
例2:按时间划分:
- create table ordersNew
- (
- order_id number(12),
- order_date date not null,
- order_total number(8,2)
- )
- partition by range(order_date)
- (
- partition p1 values less than (to_date('2005-01-01','yyyy-mm-dd')),
- partition p2 values less than (to_date('2006-01-01','yyyy-mm-dd')),
- partition p3 values less than (to_date('2007-01-01','yyyy-mm-dd')),
- )
- -----------------------------------------------------------------------------
- insert into ordersNew values(1,sysdate,200);
- insert into ordersNew values(2,to_date('2006-11-11','yyyy-mm-dd'),200);
- -----------------------------------------------------------------------------
- select * from ordersNew partition(p3);
例3:MAXVALUE:
- create table ordersNew
- (
- order_id number(12),
- order_date date not null,
- order_total number(8,2)
- )
- partition by range(order_date)
- (
- partition p3 values less than (to_date('2007-01-01','yyyy-mm-dd')),
- partition p4 values less than (maxvalue)
- )
- -----------------------------------------------------------------------------
- insert into ordersNew values(1,sysdate,200);
- insert into ordersNew values(2,to_date('2006-11-11','yyyy-mm-dd'),200);
- -----------------------------------------------------------------------------
- select * from ordersNew partition(p4);
2):列表分区
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
例1:
- CREATE TABLE PROBLEM_TICKETS
- (
- PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY,
- DESCRIPTION VARCHAR2(2000),
- CUSTOMER_ID NUMBER(7) NOT NULL,
- DATE_ENTERED DATE NOT NULL,
- STATUS VARCHAR2(20)
- )
- PARTITION BY LIST (STATUS)
- (
- PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01,
- PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
)
例2:
- CREATE TABLE ListTable
- (
- id INT PRIMARY KEY ,
- name VARCHAR (20),
- area VARCHAR (10)
- )
- PARTITION BY LIST (area)
- (
- PARTITION part1 VALUES ('guangdong','beijing') TABLESPACE Part1_tb,
- PARTITION part2 VALUES ('shanghai','nanjing') TABLESPACE Part2_tb
- );
- )
3):散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
例1:
- CREATE TABLE HASH_TABLE
- (
- COL NUMBER(8),
- INF VARCHAR2(100)
- )
- PARTITION BY HASH (COL)
- (
- PARTITION PART01 TABLESPACE HASH_TS01,
- PARTITION PART02 TABLESPACE HASH_TS02,
- PARTITION PART03 TABLESPACE HASH_TS03
- )
简写:
- CREATE TABLE emp
- (
- empno NUMBER (4),
- ename VARCHAR2 (30),
- sal NUMBER
- )
- PARTITION BY HASH (empno) PARTITIONS 8
- STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
4):组合范围散列分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

- CREATE TABLE SALES
- (
- PRODUCT_ID VARCHAR2(5),
- SALES_DATE DATE,
- SALES_COST NUMBER(10),
- STATUS VARCHAR2(20)
- )
- PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
- (
- PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
- (
- SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
- SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
- ),
- PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
- (
- SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
- SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
- )
- )

5):复合范围散列分区:
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

- create table dinya_test
- (
- transaction_id number primary key,
- item_id number(8) not null,
- item_description varchar2(300),
- transaction_date date
- )
- partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
- (
- partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
- partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
- partition part_03 values less than(maxvalue)
- );

6):间隔分区
例如:
- --------------------------按年分区:间隔1年时间;后续按照1年时间分区--------------------------------
- CREATE table intervalOrdersNew
- partition by range(order_date)
- interval(numtoyminterval(1,'YEAR'))(partition p1 values less than (to_date('2005-01-01','yyyy-mm-dd')))
- AS SELECT * FROM OrdersNew;
5):有关表分区的一些维护性操作
1): 添加分区
以下代码给SALES表添加了一个P3分区
- ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意:以上添加的分区界限应该高于最后一个分区界限。
以下代码给SALES表的P3分区添加了一个P3SUB1子分区
- ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
2):删除分区
以下代码删除了P3表分区:
- ALTER TABLE SALES DROP PARTITION P3;
在以下代码删除了P4SUB1子分区:
- ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。
3): 截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
- ALTER TABLE SALES TRUNCATE PARTITION P2;
通过以下代码截断子分区:
- ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
4): 合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:
- ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
5): 拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。
- ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
6): 接合分区(coalesca)
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:
- ALTER TABLE SALES COALESCA PARTITION;
7): 重命名表分区
以下代码将P21更改为P2
- ALTER TABLE SALES RENAME PARTITION P21 TO P2;
8): 相关查询
跨分区查询

- select sum( *) from
- (select count(*) cn from t_table_SS PARTITION (P200709_1)
- union all
- select count(*) cn from t_table_SS PARTITION (P200709_2)
- );

--查询表上有多少分区
- SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
--查询索引信息

- select object_name,object_type,tablespace_name,sum(value)
- from v$segment_statistics
- where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
- group by object_name,object_type,tablespace_name
- order by 4 desc

--显示数据库所有分区表的信息:
- select * from DBA_PART_TABLES
--显示当前用户可访问的所有分区表信息:
- select * from ALL_PART_TABLES
--显示当前用户所有分区表的信息:
- select * from USER_PART_TABLES
--显示表分区信息 显示数据库所有分区表的详细分区信息:
- select * from DBA_TAB_PARTITIONS
--显示当前用户可访问的所有分区表的详细分区信息:
- select * from ALL_TAB_PARTITIONS
--显示当前用户所有分区表的详细分区信息:
- select * from USER_TAB_PARTITIONS
--显示子分区信息 显示数据库所有组合分区表的子分区信息:
- select * from DBA_TAB_SUBPARTITIONS
--显示当前用户可访问的所有组合分区表的子分区信息:
- select * from ALL_TAB_SUBPARTITIONS
--显示当前用户所有组合分区表的子分区信息:
- select * from USER_TAB_SUBPARTITIONS
--显示分区列 显示数据库所有分区表的分区列信息:
- select * from DBA_PART_KEY_COLUMNS
--显示当前用户可访问的所有分区表的分区列信息:
- select * from ALL_PART_KEY_COLUMNS
--显示当前用户所有分区表的分区列信息:
- select * from USER_PART_KEY_COLUMNS
--显示子分区列 显示数据库所有分区表的子分区列信息:
- select * from DBA_SUBPART_KEY_COLUMNS
--显示当前用户可访问的所有分区表的子分区列信息:
- select * from ALL_SUBPART_KEY_COLUMNS
--显示当前用户所有分区表的子分区列信息:
- select * from USER_SUBPART_KEY_COLUMNS
--怎样查询出oracle数据库中所有的的分区表
- select * from user_tables a where a.partitioned='YES'
--删除一个表的数据是
- truncate table table_name;
--删除分区表一个分区的数据是
- alter table table_name truncate partition p5;
Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear.
面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!
分享知识-快乐自己:oracle表分区详解的更多相关文章
- oracle表分区详解
原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...
- oracle表分区详解(按天、按月、按年等)
分区表的概念: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间 ...
- Oracle表空间详解
Oracle表空间详解 1.表空间的分类 Oracle数据库把表空间分为两类:系统表空间和非系统表空间. 1.1系统表空间指的是数据库系统创建时需要的表空间,这些表空间在数据库创建时自动创建,是每个数 ...
- SQL Server表分区详解
原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...
- oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- MySQL的表分区详解
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
- mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- mysql分表和表分区详解
为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...
随机推荐
- 怎样通过Html网页调用本地安卓app
怎样使用html网页和本地app进行传递数据呢?经过研究.发现还是有方法的,总结了一下,大致有一下几种方式 一.通过html页面打开Android本地的app 1.首先在编写一个简单的html页面 & ...
- ARM内核和架构
转:深入浅谈,CPU设计原理 CPU的内部架构和工作原理 推荐一本书:编码的奥秘 一.ARM内核和架构 ARM产品越来越丰富,命名也越来越多.很多朋友提问: ARM内核和架构都是什么 ...
- 网络虚拟化基础协议之Geneve
网络虚拟化最基础的技术莫过于分层(Overlay.Underlay),要实现分层有两种手段.一个是映射(Mapping),一个是封装(Encapsulation). 映射,主要思路是转发时替换报文语义 ...
- Hollis原创|不了解这12个语法糖,别说你会Java
GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...
- hdu 5071 Chat-----2014acm亚洲区域赛鞍山 B题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 Chat Time Limit: 2000/1000 MS (Java/Others) M ...
- Java提高(二)---- HashTable
阅读博客 java提高篇(二五)—–HashTable 这篇博客由chenssy 发表与2014年4月,基于源码是jdk1.7 ========================== 本文针对jdk1. ...
- nstall-Package : 无法找到程序包“MySql.Data.Entity.EF6”
在vs2013中用MySQL+EF6时,会遇到版本的问题,解决方法一般如下: 1 Install-Package EntityFramework -Version 6.0.0然后Enter2 Inst ...
- hunnu--11548--找啊找啊找朋友
找啊找啊找朋友 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 14, ...
- Linux的经常使用命令(1) - 指定执行级别
命令:init [0123456] 执行级别 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重新启动 经常使用执行级别是3 ...
- EntityFramework走马观花之CRUD(下)
我在Entity Framework系列文章的CRUD上篇中介绍了EF的数据查询,中篇谈到了EF的数据更新,下篇则聊聊EF实现CRUD的内部原理. 跟踪实体对象状态 在CRUD上篇和中篇谈到,为了实现 ...