ORACLE分区表注记

来源:互联网 发布:防黑客攻击软件 编辑:程序博客网 时间:2024/05/01 22:35

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

---------------------------------------------------------------------

在表分区之前应该做些准备工作,需要确保预先创建的分区能够存放所有已有数据,否则重定义过程会出错,然后再创建创建中间表。

如:

--  select min(CREATE_TIME), max(CREATE_TIME)  from table;
--  select count(*) from table where ID is null;
--   COUNT(*)
--          0


1.范围分区

范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。
1)   每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
2)在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。


以下例子为简单起见,数据按月分区。

1.表DDL sql如下:

create table P_T_TEST 
(
   ID        VARCHAR2(32)         not null,
   CREATE_TIME          TIMESTAMP,
   MODIFY_TIME          TIMESTAMP
)
partition by range(CREATE_TIME)
interval(numtoyminterval (1,'month'))
(
   partition P201601 values less than (to_date('20160201','yyyyMMdd'))
);


-- 普通索引处理方法:
-- 1. 添加 LOCAL关键字即可
-- 2. 索引名字不能和原有索引名字重复
--PK

prompt "Create index I_T_TEST for table T_TEST"
create unique index PK_P_T_TEST_ID on P_T_TEST (ID);
alter table P_T_TEST  add constraint PK_P_T_TEST primary key (ID)  using index PK_P_T_TEST_ID;
--INDEX
create index IX_P_T_TEST_CREATE_TIME on P_T_TEST(CREATE_TIME) local;
create index IDX_P_T_TEST    on P_T_TEST  (ID);

因为CREATE_TIME是分区键,所以这样就创建了一个有前缀的本地索引。
创建一个Local索引,这里可以将不同分区的索引指定创建到不同的表空间。


2.
表A 在字段CREATE_TIME上进行分区,每个月为一个分区:
2016年6月为分区P201606
2016年7月为分区P201607
2016年8月为分区P201608


执行SQL 使用分区键检索:
select * from T_TEST t where CREATE_TIME > to_date('2016-07-12','yyyy-mm-dd') and CREATE_TIME < to_date('2016-08-12','yyyy-mm-dd')
 
执行计划如下,使用分区键进行索引,会自动在数据存在的区进行检索。


3.
执行SQL 不使用分区键检索:
select * from T_TEST t where MODIFY_TIME > to_date('2016-07-12','yyyy-mm-dd') and MODIFY_TIME < to_date('2016-08-12','yyyy-mm-dd')
 
执行计划如下:没有使用分区键进行检索,那么则会查询全部的表分区。其它的分区数据也被读取了,增大了数据库压力,效率低下。
 
所以对于非分区键检索执行查询SQL 需要指定使用分区:

select * from 分区表T_TEST partition(P201607) t where MODIFY_TIME > to_date('2016-07-12','yyyy-mm-dd') and MODIFY_TIME < to_date('2016-08-12','yyyy-mm-dd')


-------------------------------

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

3.散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

 
0 0