概述
数据分区主要目的是为了在特定的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'))