概述

   数据分区主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 

orcale的分区

  1.range分区:就是区域分区

在数据库创建分区

CREATE TABLE TEST
(
    ID VARCHAR2(5),
    COUNT NUMBER(10,2),
   DATE  TIMESTAMP
)
PARTITION BY RANGE (COUNT)
(
    PARTITION P1 VALUES TEST THAN (1000) TABLESPACE CUS_TS01,
    PARTITION P2 VALUES TEST THAN (2000) TABLESPACE CUS_TS02
)

select * from user_tab_partitions; --查询所有分区情况
select * from TEST partition(p1); --查询某表的某一分区数据

分区后,新增数据的COUNT字段如果小于1000就存储到P1分区中,如果1000到2000存储到P2分区中。

但是这时如果我们新增的一条数据的COUNT字段值大于2000,将无法存储到表中。我们可以扩展分区,语法如下:

  alter table TEST add partition p4 values less than(maxvalue); --大于2000的都会存到此分区中,当然也可以增加更多的分区

删除分区的语法如下:

  alter table TEST drop partition p4; --注意:删除分区会把分区内已有的数据同时删除

如果现在update分区p1中的COUNT值为1500,需要在update前增加以下语句:

  alter table TEST enable row movement; --使其row能移动

这样再update就可以成功了

2.分区索引

  分区索引大体上分为两大类,一类叫做local,一类叫做global。

  local:在每个分区上建立索引

  global:一种在全局上建立索引

创建语法

create index idx_count on TEST(count) local;--建立分区索引,在sale表的每个分区都建立了索引

select * from user_ind_partitions;--查询所有分区索引情况

3.list分区

该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。 

4.hash分区

这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。 
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。 

5.复合分区

这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。 

6.间隔分区(工作中常用)

是一种分区自动化的分区,可以指定时间间隔进行分区,这是oracle11g的新特性,实际工作中很常用。实际上是由range分区引申的,最终实现了range分区的自动化

按月语法

create table interval_sale
(sid int,sdate timestamp)
partition by range(sdate)
interval (numtoyminterval(1,'DAY'))
(
partition p1 values less than (TIMESTAMP '2018-05-09 00:00:00.00')
)

 按天创建

create table interval_sale
(sid int,sdate timestamp)

partition by range(sdate)
interval (NUMTODSINTERVAL(1,'DAY'))
(
partition p20180509 values less than (TIMESTAMP '2018-05-09 00:00:00.00')
)