———————————————

——— 表分区丶概念 ———

———————————————

表空间:
是一个或多个数据文件的集合,
所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。

分区表:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到一个或多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表

—————————————————-

——— 表分区丶具体作用 ———

—————————————————-

Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。
通常,分区可以使某些查询以及维护操作的性能大大提高。
此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。

从数据库管理员的角度来看,一个分区后的对象具有多个段,
这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,
使用DML命令访问分区后的表时,无需任何修改。

— 什么时候使用分区表:

  1. 表的数据量特别大
  2. 表中包含历史数据,新的数据被增加到新的分区中

————————————————

——— 表分区丶优缺点 ———

————————————————

优点:

  1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度
  2. 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用
  3. 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可
  4. 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能

缺点:

  1. 分区表相关,已经存在的表没有方法可以直接转化为分区表
  2. 需要维护

——————————————-

——— 表分区丶类型 ———

——————————————-

— 表分区类型:

  1. 范围分区:RANGE
  2. 列表分区:LIST
  3. 散列(哈希)分区:HASH
  4. 组合分区

— 1. 范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。
这种分区方式是最为常用的,并且分区键经常采用日期。
举个例子:你可能会将销售数据按照月份进行分区。
当使用范围分区时,请考虑以下几个规则:

  1. 每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。

分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。

  1. 所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
  2. 在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。 ```plsql 【例】 按入职日期进行范围分区

CREATE TABLE MYEMP ( EMPNO NUMBER(4) PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(7,2) , CONSTRAINT EMP2_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO) ) PARTITION BY RANGE (HIREDATE) ( PARTITION part1 VALUES LESS THAN (TO_DATE(‘1981-1-1’,’YYYY/MM/DD’)), —① PARTITION part2 VALUES LESS THAN (TO_DATE(‘1982-1-1’,’YYYY/MM/DD’)), PARTITION part3 VALUES LESS THAN (TO_DATE(‘1983-1-1’,’YYYY/MM/DD’)), PARTITION part4 VALUES LESS THAN (TO_DATE(‘1988-1-1’,’YYYY/MM/DD’)), PARTITION part5 VALUES LESS THAN (MAXVALUE) )

  1. **-- 2. 列表分区**<br />该分区的特点是**某列的值只有几个**,基于这样的特点我们可以采用列表分区。
  2. ```plsql
  3. 【例】 按DEPTNO进行LIST分区
  4. CREATE TABLE MYEMP2
  5. (
  6. EMPNO NUMBER(4) PRIMARY KEY,
  7. ENAME VARCHAR2(10),
  8. JOB VARCHAR2(9),
  9. MGR NUMBER(4),
  10. HIREDATE DATE,
  11. SAL NUMBER(7,2),
  12. COMM NUMBER(7,2),
  13. DEPTNO NUMBER(7,2),
  14. CONSTRAINT EMP1_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
  15. )
  16. PARTITION BY LIST (DEPTNO)
  17. (
  18. PARTITION MYEMP_DEPTNO_10 VALUES (10),
  19. PARTITION MYEMP_DEPTNO_20 VALUES (20) ,
  20. PARTITION MYEMP_DEPTNO_30 VALUES (30) ,
  21. PARTITION MYEMP_DEPTNO_40 VALUES (40)
  22. )

— 3. 散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。
列的值没有合适的条件时,建议使用散列分区。
散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,
因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

  1. CREATE TABLE GRADERECORD
  2. (
  3. GRADENO VARCHAR2(10), --年级ID
  4. SNAME VARCHAR2(20) --学生信息
  5. )
  6. PARTITION BY HASH(GRADENO)
  7. (
  8. PARTITION G1,
  9. PARTITION G2,
  10. PARTITION G3
  11. );

— 4. 组合分区
这种分区是基于两种分区的组合,分区之中的分区被称为子分区。

  1. 【例】按入职日期进行范围分区,再按DEPTNO进行LIST子分区
  2. CREATETABLE MYEMP3
  3. (
  4. EMPNO NUMBER(4) PRIMARYKEY,
  5. ENAME VARCHAR2(10),
  6. JOB VARCHAR2(9),
  7. MGR NUMBER(4),
  8. HIREDATE DATE,
  9. SAL NUMBER(7,2),
  10. COMM NUMBER(7,2),
  11. DEPTNO NUMBER(7,2),
  12. CONSTRAINT EMP3_FK FOREIGNKEY(DEPTNO)REFERENCES DEPT(DEPTNO)
  13. )
  14. PARTITION BY RANGE(HIREDATE) SUBPARTITION BY LIST (DEPTNO)
  15. (
  16. PARTITION P1 VALUES LESS THAN(TO_DATE('1981-01-01','YYYY-MM-DD'))
  17. (
  18. SUBPARTITION P1A VALUES (10) ,
  19. SUBPARTITION P1B VALUES (20),
  20. SUBPARTITION P1C VALUES (30),
  21. SUBPARTITION P1D VALUES (40)
  22. ),
  23. PARTITION P2 VALUES LESS THAN (TO_DATE('1982-01-01','YYYY-MM-DD'))
  24. (
  25. SUBPARTITION P2A VALUES (10) ,
  26. SUBPARTITION P2B VALUES (20),
  27. SUBPARTITION P2C VALUES (30),
  28. SUBPARTITION P2D VALUES (40)
  29. ),
  30. PARTITION P3 VALUES LESS THAN (TO_DATE('1983-01-01','YYYY-MM-DD'))
  31. (
  32. SUBPARTITION P3A VALUES (10) ,
  33. SUBPARTITION P3B VALUES (20),
  34. SUBPARTITION P3C VALUES (30),
  35. SUBPARTITION P3D VALUES (40)
  36. ),
  37. PARTITION P4 VALUES LESS THAN (TO_DATE('1988-01-01','YYYY-MM-DD'))
  38. (
  39. SUBPARTITION P4A VALUES (10) ,
  40. SUBPARTITION P4B VALUES (20),
  41. SUBPARTITION P4C VALUES (30),
  42. SUBPARTITION P4D VALUES (40)
  43. )
  44. )

——————————————-

——— 表分区丶代码维护———

——————————————-

  • 添加分区

以下代码给SALES表添加了一个P3分区

  1. ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
  2. 注意:以上添加的分区界限应该高于最后一个分区界限。

以下代码给SALES表的P3分区添加了一个P3SUB1子分区

  1. ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
  • 删除分区

以下代码删除了P3表分区

  1. ALTER TABLE SALES DROP PARTITION P3;

以下代码删除了P4SUB1子分区

  1. ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
  2. 注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。
  • 截断分区

截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。
当表中即使只有一个分区时,也可以截断该分区。

通过以下代码截断分区

  1. ALTER TABLE SALES TRUNCATE PARTITION P2;

通过以下代码截断子分区

  1. ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
  • 合并分区

合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限
值得注意的是,不能将分区合并到界限较低的分区

以下代码实现了P1 P2分区的合并

  1. ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
  • 拆分分区

拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。
注意不能对HASH类型的分区进行拆分

  1. ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD'))
  2. INTO (PARTITION P21,PARTITION P22);
  • 接合分区(coalesca)

结合分区是将散列分区中的数据接合到其它分区中,
当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,
值得注意的是,接合分区只能用于散列分区中

通过以下代码进行接合分区

  1. ALTER TABLE SALES COALESCA PARTITION;
  • 重命名表分区

以下代码将P21更改为P2

  1. ALTER TABLE SALES RENAME PARTITION P21 TO P2;