oracle分区表带入SQL语句,oracle 建立分区表 – 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 134296487...

本文介绍了数据库分区的四种主要类型:范围分区、列表分区、散列分区和组合范围散列分区,并通过实例详细解释了每种分区的创建和使用。作者分享了自己在实际开发中如何运用分区表解决大数据量问题的经验,以及进行的400多万条数据的分区表测试结果。
摘要由CSDN通过智能技术生成

从上次在亚旭培训的时候,我和dba讨论一次我开发系统中为了一张表不是非常的大,采用了动态sql创建多个部门的表,然后存取相应的数据,从而解决了一张表过大的问题。当时dba和我说了分区表,我第一感觉,如果当时我知道数据库还有这种表,那我当时开发起来应该轻松的多,后来就一直有个想法,去了解分区表,因为最近自己一直都比较忙,被琐事所困,今天晚上终于抽出了点时间,了解了相关的知识,并做了400多w条数据的一个分区表的测试。

一.范围分区

范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。

--例一取值范围:

CREATE TABLE CUSTOMER

(

CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,

FIRST_NAME VARCHAR2(30) NOT NULL,

LAST_NAME VARCHAR2(30) NOT NULL,

PHONE VARCHAR2(15) NOT NULL,

EMAIL VARCHAR2(80),

STATUS CHAR(1)

)

PARTITION BY RANGE (CUSTOMER_ID)

(

PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,

PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02,

PARTITION CUS_PART3 VALUES LESS THEN (MAXVALUE) TABLESPACE CUS_TS02

)

--例二按时间划分(随着时间的增长,还需要添加分区表):

CREATE TABLE ORDER_ACTIVITIES

(

ORDER_ID NUMBER(7) NOT NULL,

ORDER_DATE DATE,

TOTAL_AMOUNT NUMBER,

CUSTOTMER_ID NUMBER(7),

PAID CHAR(1)

)

PARTITION BY RANGE (ORDER_DATE)

(

PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACE ORD_TS01,

PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,

PARTITION ORD_ACT_PART03 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03

)

二.列表分区

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

--这个是我在自己电脑上测试的实例,一个sql竞赛的资料库中的数据

create table p_t2(a1 number,a2 varchar2(10),a3 varchar2(30),a4 varchar2(10),a5 number)

partition by list(a2)

(partition p_tcp values('tcp') tablespace p1,

partition p_udp values('udp') tablespace p2,

partition p_icmp values('icmp') tablespace p3)

三.散列分区

这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。

散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

CREATE TABLE HASH_TABLE

(

COL NUMBER(8),

INF VARCHAR2(100)

)

PARTITION BY HASH (COL)

(

PARTITION PART01 TABLESPACE HASH_TS01,

PARTITION PART02 TABLESPACE HASH_TS02,

PARTITION PART03 TABLESPACE HASH_TS03

)

--简写:

CREATE TABLE emp

(

empno NUMBER (4),

ename VARCHAR2 (30),

sal NUMBER

)

PARTITION BY HASH (empno) PARTITIONS 8

STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

四.组合范围散列分区

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

CREATE TABLE SALES

(

PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE,

SALES_COST NUMBER(10),

STATUS VARCHAR2(20)

)

PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)

(

PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009

(

SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,

SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009

),

PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009

(

SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,

SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009

)

)

五.复合范围散列分区

这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

create table dinya_test

(

transaction_id number primary key,

item_id number(8) not null,

item_description varchar2(300),

transaction_date date

)

partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)

(

partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),

partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),

partition part_03 values less than(maxvalue)

);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值