分区表的概念:
  
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表的优点:

1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

分区表的种类:

1.范围分区
概念: 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。

-- 按行分区
SQL> CREATE TABLE part_andy1
  2  (
  3      andy_ID NUMBER NOT NULL PRIMARY KEY,
  4      FIRST_NAME  VARCHAR2(30) NOT NULL,
  5      LAST_NAME   VARCHAR2(30) NOT NULL,
  6      PHONE        VARCHAR2(15) NOT NULL,
  7      EMAIL        VARCHAR2(80),
  8      STATUS       CHAR(1)
  9  )
 10  PARTITION BY RANGE (andy_ID)
 11  (
 12      PARTITION PART1 VALUES LESS THAN (10000) ,
 13      PARTITION PART2 VALUES LESS THAN (20000)
 14  );

Table created.

-- 按时间分区

SQL> CREATE TABLE part_andy2
  2  (
  3  ORDER_ID      NUMBER(7) NOT NULL,
  4  ORDER_DATE    DATE,
  5  OTAL_AMOUNT NUMBER,
  6  CUSTOTMER_ID NUMBER(7),
  7  PAID           CHAR(1)
  8  )
  9  PARTITION BY RANGE (ORDER_DATE)
 10  (
 11    PARTITION p1 VALUES LESS THAN (TO_DATE('2014-10-1', 'yyyy-mm-dd')) ,
 12    PARTITION p2 VALUES LESS THAN (TO_DATE('2015-10-1', 'yyyy-mm-dd')) ,
 13    PARTITION p3 VALUES LESS THAN (TO_DATE('2016-10-1', 'yyyy-mm-dd')) ,
 14    partition p4 values less than (maxvalue)
 15  );

Table created.

2.  Hash分区

概念:
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。

注意:
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

--按hash分区
SQL> create table part_andy3
  2  (
  3  transaction_id number primary key,
  4  item_id number(8) not null
  5  )
  6  partition by hash(transaction_id)
  7  (
  8  partition part_01 ,
  9  partition part_02 ,
 10  partition part_03
 11  );

Table created.

3.  List分区

概念:
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。

注意:
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

-- 按list分区
SQL> create table part_andy4
  2  (
  3  id varchar2(15 byte) not null,
  4  city varchar2(20)
  5  )
  6  partition by list (city)
  7  (
  8  partition t_list025 values ('beijing'),
  9  partition t_list372 values ('shanghai') ,
 10  partition t_list510 values ('changsha'),
 11  partition p_other values (default)
 12  );

Table created.

4. 组合分区

Oracle10g提供两种分区组合
– Range-hash
SQL> create table part_andy5
  2  (
  3  transaction_id number primary key,
  4  item_id number(8) not null,
  5  item_description varchar2(300),
  6  transaction_date date
  7  )
  8  partition by range(transaction_date)subpartition by hash(transaction_id)
  9  (
 10  partition part_01 values less than(TO_DATE('2014-10-1', 'yyyy-mm-dd')),
 11  partition part_02 values less than(TO_DATE('2015-10-1', 'yyyy-mm-dd')),
 12  partition part_03 values less than(maxvalue)
 13  );

Table created.

– Range-list
SQL> CREATE TABLE SALES
  2  (
  3  PRODUCT_ID VARCHAR2(5),
  4  SALES_DATE DATE,
  5  SALES_COST NUMBER(10),
  6  STATUS VARCHAR2(20)
  7  )
  8  PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
  9  (
 10  PARTITION P1 VALUES LESS THAN(TO_DATE('2014-10-1', 'yyyy-mm-dd'))
 11  (SUBPARTITION P1SUB1 VALUES ('ACTIVE') ,SUBPARTITION P1SUB2 VALUES ('INACTIVE')
 12  ),PARTITION P2 VALUES LESS THAN (TO_DATE('2015-10-1', 'yyyy-mm-dd'))
 13  (
 14  SUBPARTITION P2SUB1 VALUES ('ACTIVE') ,
 15  SUBPARTITION P2SUB2 VALUES ('INACTIVE')
 16  )
 17  );

Table created.

 Oracle11g增加了四种组合
– RANGE-RANGE
– LIST-RANGE
– LIST-HASH
– LIST-LIST 

Oracle 11g 中虚拟列来实现。在11g之前 分区表的partition key必须是物理存在的。11g开始提供了虚拟列,并且可以作为partition key 。
--按星期分区 
SQL> CREATE TABLE part_andy6
  2  (
  3  getdate   date NOT NULL,
  4  wd        NUMBER GENERATED ALWAYS AS (TO_NUMBER (TO_CHAR (getdate, 'D'))) VIRTUAL
  5  )
  6  PARTITION BY LIST (wd)
  7  (
  8  PARTITION Mon  VALUES (1),
  9  PARTITION Tue  VALUES (2),
 10  PARTITION Wed  VALUES (3),
 11  PARTITION Thu  VALUES (4),
 12  PARTITION Fri  VALUES (5),
 13  PARTITION Sat   VALUES (6),
 14  PARTITION Sun  VALUES (7)
 15  );

Table created.

SQL>
SQL> insert into part_andy6(getdate) values(sysdate);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-1);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-2);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-3);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-4);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-5);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-6);

1 row created.

SQL> insert into part_andy6(getdate) values(sysdate-7);

1 row created.

-- 检查测试成功
SQL> select * from part_andy6;

GETDATE                     WD
------------------- ----------
2014-11-23 16:35:07          1
2014-11-24 16:35:07          2
2014-11-25 16:35:07          3
2014-11-26 16:35:07          4
2014-11-27 16:35:07          5
2014-11-28 16:35:07          6
2014-11-29 16:35:07          7
2014-11-22 16:35:08          7

8 rows selected.

Oracle Database 11g,Interval类型分区表,可以根据加载数据,自动创建指定间隔的分区。

创建按月分区的分区表:

a. 创建分区表

SQL> CREATE TABLE interval_andy7 (a1 NUMBER, a2 DATE)
  2  PARTITION BY RANGE (a2)
  3  INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
  4  (PARTITION part1
  5  VALUES LESS THAN (TO_DATE('2014-11-1', 'yyyy-mm-dd')),
  6  PARTITION part2
  7  VALUES LESS THAN (TO_DATE('2014-12-1', 'yyyy-mm-dd'))
  8  );

Table created.
注意:如果在建Interval分区表是没有把所有的分区写完成,在插入相关数据后会自动生成分区
b. 查看现在表的分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_ANDY7';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVALPART                   PART1
INTERVALPART                   PART2
c.  插入测试数据:
SQL> begin
  2  for i in 0 .. 11 loop
  3  insert into interval_andy7 values(i,add_months(to_date('2014-11-1','yyyy-mm-dd'),i));
  4  end loop ;
  5  commit;
  6  end;
  7  /

PL/SQL procedure successfully completed.

PL/SQL 过程已成功完成。
补充:add_months()函数获取前一个月或者下一个月的月份, 参数中 负数 代表 往前, 正数 代表 往后。
--上一个月
select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;
--下一个月 
select to_char(add_months(trunc(sysdate),1),'yyyymm') from dual;
d. 观察自动创建的分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_ANDY7';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_ANDY7                 PART1
INTERVAL_ANDY7                 PART2
INTERVAL_ANDY7                 SYS_P24
INTERVAL_ANDY7                 SYS_P25
INTERVAL_ANDY7                 SYS_P26
INTERVAL_ANDY7                 SYS_P27
INTERVAL_ANDY7                 SYS_P28
INTERVAL_ANDY7                 SYS_P29
INTERVAL_ANDY7                 SYS_P30
INTERVAL_ANDY7                 SYS_P31
INTERVAL_ANDY7                 SYS_P32

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_ANDY7                 SYS_P33
INTERVAL_ANDY7                 SYS_P34

13 rows selected.

下面创建一个以天为间隔的分区表:

1. 创建分区表:
SQL> create table interval_andy8
  2  (
  3  id    number,
  4  dt    date
  5  )
  6  partition by range (dt)
  7  INTERVAL (NUMTODSINTERVAL(1,'day'))
  8  (
  9  partition p20141101 values less than (to_date('2014-11-1','yyyy-mm-dd'))
 10  );

Table created.

2. 查看表分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_ANDY8';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_ANDY8                 P20141101

3. 插入测试数据:
begin
for i in 1 .. 12 loop
insert into INTERVAL_ANDY8 values(i,trunc(to_date('2014-11-1','yyyy-mm-dd')+i));
end loop;
commit;
end;
/
PL/SQL 过程已成功完成。
4. 观察自动创建的分区:
SQL> select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_ANDY8';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_ANDY8                 P20141101
INTERVAL_ANDY8                 SYS_P35
INTERVAL_ANDY8                 SYS_P36
INTERVAL_ANDY8                 SYS_P37
INTERVAL_ANDY8                 SYS_P38
INTERVAL_ANDY8                 SYS_P39
INTERVAL_ANDY8                 SYS_P40
INTERVAL_ANDY8                 SYS_P41
INTERVAL_ANDY8                 SYS_P42
INTERVAL_ANDY8                 SYS_P43
INTERVAL_ANDY8                 SYS_P44

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_ANDY8                 SYS_P45
INTERVAL_ANDY8                 SYS_P46

13 rows selected.

说明:个人总结+网络博文
参考: http://blog.csdn.net/tianlesoftware/article/details/5662337

oracle表分区详解(按天、按月、按年等)的更多相关文章

  1. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  2. 分享知识-快乐自己:oracle表分区详解

    从以下几个方面来整理关于分区表的概念及操作: 1)表空间及分区表的概念: 2)表分区的具体作用: 3)表分区的优缺点: 4)表分区的几种类型及操作方法: 5)对表分区的维护性操作: 1):表空间及分区 ...

  3. Oracle表空间详解

    Oracle表空间详解 1.表空间的分类 Oracle数据库把表空间分为两类:系统表空间和非系统表空间. 1.1系统表空间指的是数据库系统创建时需要的表空间,这些表空间在数据库创建时自动创建,是每个数 ...

  4. SQL Server表分区详解

    原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...

  5. oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  6. MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  7. mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  8. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  9. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

随机推荐

  1. ubuntu上用eclipse搭建java、python开发环境

    上一篇文章讲到如何在windwos上用eclipse搭建java.python开发环境,这一讲将关注如何在ubuntu上实现搭建,本人使用虚拟机安装的ubuntu系统,系统版本为:14.04 lts ...

  2. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  3. RecyclerView因版本问题无法加载

    前几天在学习RecyclerView时候,一直失败,各种加载不上.下面是错误信息 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL ...

  4. 关于JavaEE 开发中web.xml的主要配置及其使用

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  5. HTML DOM对象之createElement()方法

    今天在学习DOM节点操作时,发现了创建DOM节点的createElement()方法的一个有意思的现象. 代码如下: var box=document.getElementById("box ...

  6. 解决Oracle+weblogic系统死机的问题

    前段时间发布的系统(Oracle+weblogic)频繁挂掉,每天早上9点.下午2点高峰期就挂,纠结了很长时间,最终解决,方法描述下. 执行select count(*),status from v$ ...

  7. Draw_extend使用OpenGL显示数据点

    //alter load_map.dev //safety verion 2016/1/12 #include <iostream> #include <fstream> #i ...

  8. linux /boot 清理

    随着升级 /boot分区会越来越满 导致后续无法升级  原因是因为每次升级有可能升级内核  但是旧的内核没有删除  所以导致/boot一直增大 解决办法就是删除不需要的内核,一下步骤: 查看所有安装的 ...

  9. CentOS下查看进程和删除进程

    1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...

  10. ios选取相册视频,过滤掉所有图片!

    imagePicker = [[UIImagePickerController alloc]init]; imagePicker.mediaTypes = [NSArray arrayWithObje ...