ORACLE 分区
- 分区的原因
- 分区的优势
- 分区方式
- 分区sql说明
- 分区方式
oracle 11g 支持自动分区,不过得在创建表时就设置好分区。
分区的原因
单表的数据量如果太大,会影响到读写性能。我们可以使用分库分表来解决单表的性能问题。Oracle的分区表是将一张大表在物理上分成几张较小的表,从逻辑上来看仍然是一张完整的表。这样每次DML操作可以只考虑其中一张分区表。oracle建议单表大小超过2GB时就使用分区表。
分区功能能够将表、索引或索引组织表进一步细分为段,从而能够更精确地管理和访问这些数据库对象。这些数据库对象的段叫做分区。
分区表应用在大表更合适,至少要大于100万条的记录才可以考虑使用分区表。
现实中的场景:图书馆的图书分区
分区的优势
(IO速度、删除、查询、维护、安全)
-
由于Oracle数据库可以将分区指定为不同的表空间,而不同的表空间是可以指向不同的磁盘设备的,在很多时候,磁盘设备的I/O速度是系统进行数据操作的瓶颈,而分区并行,则起到了优化物理硬件资源,从而缩短了执行的时间的作用。
-
分区,就类似于我们将图书分类放到了不同的区间中,这个时候,我们就可以只针对其中的某一类图书进行操作,比如进行该类书籍的查询、上架、下架、甚至将该类图书付之一炬,这带来了两个特别大的优势,第一,我们无视其他分区的数据;第二,我们可以很方便的对本区的数据进行删除操作。
-
提高了特定的查询速度,比如我们现在只需要查找IT类图书的数量,因为我们能够在第一意识中,排除其他非IT类书籍,必然会提高查询的性能。
-
节约维护的成本,传统的维护操作,例如重建索引等,因为有锁机制的存在,是会影响到其他人的读取和更新删除操作的,但是由于有了分区,我们在维护IT类书籍的时候,就不会对其他分类的数据造成影响,这个时候,可以降低因为维护数据而对其他系统数据产生的各种影响。
-
从安全的角度上而言,我们将不同的分区放在不同的表空间当中,就类似于我们没有将所有的鸡蛋放到一个篮子里面,必然会带来安全方面的提升。
(转载,原文链接:https://blog.csdn.net/ziwen00/article/details/9158725)
分区方式
分区sql说明
建表时:通过PARTITION BY RANGE(字段名) 关键字来指出进行按哪个字段进行分区的策略
分区方式
- 范围分区
例如:日期分类;
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 TWHERE 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 TWHERE T.SEGMENT_NAME IN ('PART_LOG_CHENZW');
- 列表分区
如果数据中的某一项是可以被枚举的,那么,此列就可以用作列表分区的分区字段。
建表、分区:
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
);
- 散列分区
散列分区的更多的作用在于分散数据,通过将数据均匀分布从而规避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
);
- 组合分区
将一大堆数据通过分区拆解为若干个小标进行管理,从而降低了管理的粒度,做到“精细化管理”。
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