oracle的表分区的定义与操作

摘要:
--创建表时建立分区表CREATETABLEdrawlistPARTITIONBYrange--插入数据,系统会自动将数据保存到对应的分区表中。

一、表分区

(一)表分区的分类

1、范围分区(range)

2、散列分区(hash)

3、列表分区(list)

4、复合分区:范围-哈希(range-hash)、范围-列表(range-list)

(二)范围分区:

范围分区是应用范围比较广的分区方式,它是以列的值得范围来作为分区的划分条件,将记录存放到列值所在的range分区中。

例:按照时间创建表分区。

复制代码
--创建表时建立分区表
CREATE TABLE drawlist(
    drawname VARCHAR2(20),
    drawtime DATE NOT NULL
)
PARTITION BY range(drawtime)(  --创建表分区,以drawtime为分区范围
          PARTITION part_1 VALUES LESS THAN (to_date('2010-1-1','yyyy-mm-dd')),  --定义2010-1-1以前的数据保存的分区,不包括2010-1-1
                    PARTITION part_2 VALUES LESS THAN (to_date('2011-1-1','yyyy-mm-dd')),  --定义2011-1-1以前的数据分区
                    PARTITION part_3 VALUES LESS THAN (to_date('2012-1-1','yyyy-mm-dd')),
                    PARTITION part_4 VALUES LESS THAN (maxvalue)   --其他的值保存的分区
)

--插入数据,系统会自动将数据保存到对应的分区表中。
INSERT INTO drawlist
SELECT 'aaa',to_date('2009-10-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'bbb',to_date('2009-11-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'ccc',to_date('2009-12-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'ddd',to_date('2010-10-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'eee',to_date('2010-10-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'fff',to_date('2011-10-20','yyyy-mm-dd') FROM dual UNION 
SELECT 'ggg',to_date('2012-10-20','yyyy-mm-dd') FROM dual 

--查询分区表
SELECT * FROM drawlist PARTITION (part_1);
SELECT * FROM drawlist PARTITION (part_2);
SELECT * FROM drawlist PARTITION (part_3);
SELECT * FROM drawlist PARTITION (part_4);
复制代码

(三)散列分区:

对于那些无法有效的划分范围的表,可以使用hash分区。hash分区会将数据平均的分配到指定的几个分区表中,由于数据被平均分配到不同的分区,减少查询时对数据块的竞争,这样对于提高性能还是会有一些帮助,列所在的分区是一句分区列的hash值自动分配,因此不能控制,也不知道哪条记录被放到哪个分区中,hash分区也可以支持多个依赖咧。建立散列分区最好使用2的冥次个分区表。比如2,4,8,16等。

例:

复制代码
--创建表
CREATE TABLE drawlist(
    draw_id NUMBER,
    draw_name VARCHAR2(20)
)
--创建散列分区
PARTITION BY HASH(draw_name)
(
    PARTITION p1 TABLESPACE USERS,
        PARTITION p2 TABLESPACE USERS,
        PARTITION p3 TABLESPACE USERS,
        PARTITION p4 TABLESPACE USERS
);

--生成1000行数据
--查询各个分区表中的数据。
SELECT COUNT(*) FROM drawlist PARTITION (p1);
SELECT COUNT(*) FROM drawlist PARTITION (p2);
SELECT COUNT(*) FROM drawlist PARTITION (p3);
SELECT COUNT(*) FROM drawlist PARTITION (p4);

(四)列表分区:

列表分区也需要指定列的值,其分区必须明确指定,该分区列只能有一个,不能像range或hash分区那样同时指定多个列作为分区依赖列,但它的单个分区对应值可以是多个。使用列表分区,必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储哪些不在指定范围内的记录,类似range分区中的maxvalue分区。  

复制代码
CREATE TABLE area
(
    CODE NUMBER,
        NAME VARCHAR2(20)
)
--创建列表分区
PARTITION BY LIST(CODE)
(
     PARTITION p1 VALUES(10,20,30),  --指定当code值为10,20,30为第一分区
         PARTITION p2 VALUES(40,50,60),  --指定当code值为40,50,60为第二分区
         PARTITION p_other VALUES(DEFAULT)  --其他值为第三分区
)

select * from area PARTITION (p1);
select * from area PARTITION (p2);
select * from area PARTITION (p_other);
复制代码

(五)复合分区

如果某表按照某列分区之后仍然较大,或者有一些其他的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

组合分区分为:

1、范围-哈希(range-hash)

语法:

PARTITION BY RANGE (列1) SUBPARTITION BY HASH(列2)(

PARTITION 分区名 VALUES LESS THAN (值)

TABLESPACE 表空间

)

2、范围-列表(range-list)

语法:  

PARTITION BY RANGE (列1) SUBPARTITION BY LIST(列2)(

PARTITION 分区名 VALUES LESS THAN (值)

TABLESPACE 表空间(

SUBPARTITION 子分区名 VALUES(列表指定值...)TABLESPACE 表空间

)

二、分区维护

1、增加分区

语法:

ALTER TBALE 表名 ADD PARTITION 分区表名 VALUES LESS THAN(值)

例如:  

--增加区间分区
ALTER TABLE drawlist ADD PARTITION p3 VALUES LESS THEN to_date('2013-1-1','yyyy-mm-dd') TABLESPACE USERS;
--注意:插入的区间数据值不能小于原有的分区表的值。如果包含了maxvalues,必须删除原有分区表

2、删除分区

语法:

ALTER TABLE 表名 DROP PARTITION 分区表名

例:

--删除区间分区
ALTER TABLE drawlist DROP PARTITION p3 
--删除分区表后,分区表中的数据也会一同删除

3、截断分区

删除当前分区中的数据,但是它并不会影响其他分区。

语法:

ALTER TABLE 表名 TRUNCATE PARTITION 分区表名

例:

--阶段分区表P3,清除分区表中的数据
ALTER TABLE drawlist TRUNCATE PARTITION p3 

4、合并分区

将两个分区表中的数据合并到一个分区,被合并的分区将不复存在。注意:高界线的分区不能合并到低界线的分区中。比如将小于2009年的数据合并到小于2010年的分区中,反过来则不行。

语法:

ALTER TABLE 表名 MERGE PARTITIONS 分区表1,分区表2 INTO PARTITION 分区表2

例:

--将分区表p1合并到分区表p2
ALTER TABLE drawlist MERGE PARTITIONS p1,p2 INTO PARTITION p2

免责声明:文章转载自《oracle的表分区的定义与操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PythonDay05GitHub源代码管理基本操作 Mossad下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ORACLE日期函数

以时间2007-11-0213:45:25为例 日期字段 格式 英文 解释 显示值 Year yy twodigits 两位年 07 yyy threedigits 三位年 007 yyyy fourdigits 四位年 2007 Month mm...

达梦管理分区表和分区索引

为了提高数据在大数据量读写操作和查询时的效率,DM提供了对表和索引进行分区的技术。把表和索引等数据库对象中的数据分割成小的单位,分别存放在一个个单独的段中,用户对表的访问转化为对较小段的访问,以改善大型应用系统的性能。 DM提供了水平分区方式和垂直分区方式(开发版好像不支持垂直分区表,语法:CREATE TABLE TEST (A INT,B VARCH...

Oracle数据库ORA-12154: TNS: 无法解析指定的连接标识符详解

相信使用过Oracle数据库的人一定碰到过“ORA-12154: TNS: 无法解析指定的连接标识符”错误,我在此做一个小小的总结。       在程序中连接Oracle数据库的方式与其他常用数据库,如:MySql,Sql Server不同,这些数据库可以通过直接指定IP的方式连接,但是Oracle则需要通过Oracle客户端配置网络服务名的方式来连接。否...

linux上安装Oracle 包括常见安装错误(centos8.1,oracle linux8,redhat 8)通过

谨记 关闭操作系统之前先关闭oracle数据库  oracle用户登录,执行lsnrctl start启动网络监听服务,执行dbstart启动数据库系统。  oracle用户登录,执行lsnrctl stop关闭网络监听服务,执行dbshut关闭数据库系统。 >>>>>>>>>>>>&...

Oracle查看正在执行的存储过程

正在执行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks >0 and pins >0; 正在执行的sql select a.program, b.spid, c.sql_text,c.SQL_IDfrom v$session a...

linux Nginx 日志脚本

这篇文章主要介绍了nginx日志切割脚本、nginx日志分析脚本等,需要的朋友可以参考下。 参考自:http://www.jbxue.com/article/13927.html任务计划 crontab -l 1 15 * * * /home/dongnan/sh/split.sh >> /home/dongnan/sh/cron.log 2&...