oracle数据库的分区表大致分为四种:范围分区表、hash分区表、列表分区表、复合分区表。
什么时候适合使用分区表呢:官方给的建议是当表大于2GB 或表中包含不必要的历史数据时。
分区表的优点是:1、由于数据是分别存储在不同的分区中,减少数据损坏的可能性;2、可以把分区映射到不同的磁盘上,减少I/O压力;3、可以单独对分区进行备份和恢复,提供管理性和可用性。
为了测试分区表,我们首先创建4个小的表空间
-
create tablespace sale01 datafile '/oracle/database/oradata/indsdb/sale01.dbf' size 5m autoextend next 5m maxsize 2g;
-
create tablespace sale02 datafile '/oracle/database/oradata/indsdb/sale02.dbf' size 5m autoextend next 5m maxsize 2g;
-
create tablespace sale03 datafile '/oracle/database/oradata/indsdb/sale03.dbf' size 5m autoextend next 5m maxsize 2g;
-
create tablespace sale04 datafile '/oracle/database/oradata/indsdb/sale04.dbf' size 5m autoextend next 5m maxsize 2g
首先,我们创建范围分区表,顾名思义,范围分区就是根据表的列值的大小进行分区,值的大小决定了数据存储在哪个分区上
接下来,我们创建范围分别表, 它跟非分区表的创建语句基本一下,就是需要在指定好表的列后,增加根据某列的大小设置保存的分区和使用的表空间,使用关键字range by,这里我们对create_time时间类型的字段进行分区
点击(此处)折叠或打开
-
create table RECORD_partition
-
(
-
ID CHAR(32) primary key,
-
ENTERPRISE_ID VARCHAR2(32) not null,
-
OPERATOR_ID CHAR(32),
-
TEMPLATE_ID CHAR(32),
-
WORK_CODE CHAR(10),
-
NAME VARCHAR2(300) not null,
-
CREATE_TIME DATE,
-
ACTUAL_LONGITUDE NUMBER(9,6),
-
ACTUAL_LATITUDE NUMBER(8,6),
-
ACTUAL_LOCDESC VARCHAR2(500),
-
CONTENT VARCHAR2(1000),
-
DELETE_STATE NUMBER(1),
-
PROVINCE_NAME VARCHAR2(128) default '--',
-
CITY_NAME VARCHAR2(128) default '--',
-
COUNTY_NAME VARCHAR2(128) default '--',
-
PIC_NUM NUMBER default 0 not null
-
)
-
partition by range(CREATE_TIME)
-
(
-
partition part01_2013 values less than (to_date('2014-01-01','yyyy-mm-dd')) tablespace sale01,
-
partition part02_2014 values less than (to_date('2015-01-01','yyyy-mm-dd')) tablespace sale02,
-
partition part03_2015 values less than (to_date('2016-01-01','yyyy-mm-dd')) tablespace sale03,
-
partition part04_2016 values less than (maxvalue) tablespace sale04
-
)
接下来,创建一个本地索引local ,本地索引与全局索引的区别在于全局索引在创建global子句时可以指定索引的范围值
-
create index record_partition_idx on record_partition(OPERATOR_ID)
-
local
-
(
-
partition idx_part01_2013 tablespace sale01,
-
partition idx_part02_2014 tablespace sale02,
-
partition idx_part03_2015 tablespace sale03,
-
partition idx_part04_2016 tablespace sale04
-
)
最后就是需要插入数据验证了,我们这里先杀入200行看看效果,
-
SQL> select table_name,partition_name,tablespace_name from user_tab_partitions where table_name = upper('record_partition');
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
RECORD_PARTITION PART01_2013 SALE01
RECORD_PARTITION PART02_2014 SALE02
RECORD_PARTITION PART03_2015 SALE03
RECORD_PARTITION PART04_2016 SALE04
-
SQL> insert into record_partition select * from record where rownum<=200 ;
-
-
200 rows inserted
-
-
SQL> select count(*) from record_partition partition(part04_2016);
-
-
COUNT(*)
-
----------
-
13
-
-
SQL> select count(*) from record_partition partition(part03_2015);
-
-
COUNT(*)
-
----------
-
0
-
-
SQL> select count(*) from record_partition partition(part02_2014);
-
-
COUNT(*)
-
----------
-
0
-
-
SQL> select count(*) from record_partition partition(part01_2013);
-
-
COUNT(*)
-
----------
-
187
-
-
SQL> select count(*) from record_partition ;
-
-
COUNT(*)
-
----------
-
200
-
-
SQL>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27039319/viewspace-2121065/
,如需转载,请注明出处,否则将追究法律责任。