Oracle分区

oracle 11g 支持自动分区,不过得在创建表时就设置好分区。

分区的原因

单表的数据量如果太大,会影响到读写性能。我们可以使用分库分表来解决单表的性能问题。Oracle的分区表是将一张大表在物理上分成几张较小的表,从逻辑上来看仍然是一张完整的表。这样每次DML操作可以只考虑其中一张分区表。oracle建议单表大小超过2GB时就使用分区表。
分区功能能够将表、索引或索引组织表进一步细分为段,从而能够更精确地管理和访问这些数据库对象。这些数据库对象的段叫做分区。
分区表应用在大表更合适,至少要大于100万条的记录才可以考虑使用分区表。
现实中的场景:图书馆的图书分区

分区的优势

(IO速度、删除、查询、维护、安全)

  1. 由于Oracle数据库可以将分区指定为不同的表空间,而不同的表空间是可以指向不同的磁盘设备的,在很多时候,磁盘设备的I/O速度是系统进行数据操作的瓶颈,而分区并行,则起到了优化物理硬件资源,从而缩短了执行的时间的作用。

  2. 分区,就类似于我们将图书分类放到了不同的区间中,这个时候,我们就可以只针对其中的某一类图书进行操作,比如进行该类书籍的查询、上架、下架、甚至将该类图书付之一炬,这带来了两个特别大的优势,第一,我们无视其他分区的数据;第二,我们可以很方便的对本区的数据进行删除操作。

  3. 提高了特定的查询速度,比如我们现在只需要查找IT类图书的数量,因为我们能够在第一意识中,排除其他非IT类书籍,必然会提高查询的性能。

  4. 节约维护的成本,传统的维护操作,例如重建索引等,因为有锁机制的存在,是会影响到其他人的读取和更新删除操作的,但是由于有了分区,我们在维护IT类书籍的时候,就不会对其他分类的数据造成影响,这个时候,可以降低因为维护数据而对其他系统数据产生的各种影响。

  5. 从安全的角度上而言,我们将不同的分区放在不同的表空间当中,就类似于我们没有将所有的鸡蛋放到一个篮子里面,必然会带来安全方面的提升。

(转载,原文链接:https://blog.csdn.net/ziwen00/article/details/9158725)

分区方式

分区sql说明

建表时:通过PARTITION BY RANGE(字段名) 关键字来指出进行按哪个字段进行分区的策略

分区方式

  1. 范围分区
    例如:日期分类;
DROP TABLE PART_LOG_CHENZW PURGE;

CREATE TABLE PART_LOG_CHENZW(
       LOG_ID NUMBER(20) PRIMARY KEY,
       LOG_DATE DATE,
       LOG_DESC VARCHAR2(20)
)
PARTITION BY RANGE(LOG_DATE)
(
 PARTITION PART_LOG_01 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_02 VALUES LESS THAN (TO_DATE('2013-03-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_03 VALUES LESS THAN (TO_DATE('2013-05-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_07 VALUES LESS THAN (MAXVALUE) TABLESPACE DATA
);
MAXVALUE 避免有数值没有被上面的范围圈定

插入数据后查询分区:

SELECT COUNT(1) FROM PART_LOG_CHENZW PARTITION (PART_LOG_05);

查询分区结构:
DBA_PART_TABLES和DBA_TAB_PARTITIONS


SELECT T.OWNER AS "所有者",
       T.TABLE_NAME AS "表名",
       T.PARTITIONING_TYPE AS "分区类型",
       T.SUBPARTITIONING_TYPE AS "子分区类型",
       T.PARTITION_COUNT AS "子分区数量",
       T.PARTITIONING_KEY_COUNT AS "分区键中列的数量",
       T.SUBPARTITIONING_KEY_COUNT AS "子分区键中列的数量",
       T.STATUS AS "分区表状态",
       T.DEF_TABLESPACE_NAME AS "默认表空间"
  FROM DBA_PART_TABLES T
 WHERE T.TABLE_NAME IN ('PART_LOG_CHENZW');
 

查询分区数据结构:


SELECT T.TABLE_OWNER AS "所有者",
      T.TABLE_NAME AS "表名",
      T.COMPOSITE AS "是否组合分区",
      T.PARTITION_NAME AS "分区名",
      T.SUBPARTITION_COUNT AS "子分区数",
      T.HIGH_VALUE AS "分区上限",
      T.HIGH_VALUE_LENGTH AS "分区上限长度",
      T.PARTITION_POSITION AS "分区在表中位置",
      T.TABLESPACE_NAME AS "所在表空间"
 FROM DBA_TAB_PARTITIONS T
WHERE T.TABLE_NAME IN ('PART_LOG_CHENZW')

查看分区表占用的磁盘空间信息:

SELECT T.SEGMENT_NAME AS "段名",
       T.PARTITION_NAME AS "分区名",
       T.SEGMENT_TYPE AS "分区类型",
       T.BYTES / POWER(1024, 2) || 'M' AS "分区大小",
       T.TABLESPACE_NAME AS "表空间"
  FROM USER_SEGMENTS T
 WHERE T.SEGMENT_NAME IN ('PART_LOG_CHENZW');
  1. 列表分区
    如果数据中的某一项是可以被枚举的,那么,此列就可以用作列表分区的分区字段。

建表、分区:

DROP TABLE PART_BOOK_CHENZW PURGE;

CREATE TABLE PART_BOOK_CHENZW(
       BOOK_ID NUMBER(20) PRIMARY KEY,
       BOOK_DATE DATE,
       BOOK_TYPE NUMBER(2) NOT NULL,
       BOOK_DESC VARCHAR2(20)
)
PARTITION BY LIST(BOOK_TYPE)
(
 PARTITION PART_BOOK_01 VALUES(0) TABLESPACE DATA,
 PARTITION PART_BOOK_02 VALUES(1) TABLESPACE DATA,
 PARTITION PART_BOOK_03 VALUES(2) TABLESPACE DATA,
 PARTITION PART_BOOK_04 VALUES(3) TABLESPACE DATA
);

  1. 散列分区
    散列分区的更多的作用在于分散数据,通过将数据均匀分布从而规避I/O瓶颈,但是这个在平时的生产中比较少用到。

CREATE TABLE PART_BOOK_CHENZW(
       BOOK_ID NUMBER(20) PRIMARY KEY,
       BOOK_DATE DATE,
       BOOK_TYPE NUMBER(2) NOT NULL,
       BOOK_DESC VARCHAR2(20)
)
PARTITION BY HASH(BOOK_ID)
(
 PARTITION PART_BOOK_01 TABLESPACE DATA,
 PARTITION PART_BOOK_02 TABLESPACE DATA,
 PARTITION PART_BOOK_03 TABLESPACE DATA,
 PARTITION PART_BOOK_04 TABLESPACE DATA
);

  1. 组合分区
    将一大堆数据通过分区拆解为若干个小标进行管理,从而降低了管理的粒度,做到“精细化管理”。

CREATE TABLE PART_BOOK_CHENZW(
       BOOK_ID NUMBER(20) PRIMARY KEY,
       BOOK_DATE DATE,
       BOOK_TYPE NUMBER(2) NOT NULL,
       BOOK_DESC VARCHAR2(20)
)
PARTITION BY LIST(BOOK_TYPE)
SUBPARTITION BY RANGE(BOOK_DATE)
SUBPARTITION TEMPLATE
(
 SUBPARTITION PART_LOG_01 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_02 VALUES LESS THAN (TO_DATE('2013-03-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_03 VALUES LESS THAN (TO_DATE('2013-05-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_04 VALUES LESS THAN (TO_DATE('2013-07-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_05 VALUES LESS THAN (TO_DATE('2013-09-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_06 VALUES LESS THAN (TO_DATE('2013-10-01','YYYY-MM-DD')) TABLESPACE DATA,
 SUBPARTITION PART_LOG_07 VALUES LESS THAN (MAXVALUE) TABLESPACE DATA
)
(
 PARTITION PART_BOOK_01 VALUES(0) TABLESPACE DATA,
 PARTITION PART_BOOK_02 VALUES(1) TABLESPACE DATA,
 PARTITION PART_BOOK_03 VALUES(2) TABLESPACE DATA,
 PARTITION PART_BOOK_04 VALUES(3) TABLESPACE DATA
);

整理和参考:
https://blog.csdn.net/ziwen00/article/details/9158725

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值