1. 创建分区表

1)表空间:

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

2)分区表:

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

Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间(tablespace)中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

3)表分区优点/缺点:

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

表分区有以下缺点::
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

2. 分区的类型

(1)范围分区(range)

范围分区将数据基于范围映射到每一个分区,这个范围是在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。

使用范围分区时,需要注意以下几个规则:
1、每一个分区都必须有一个VALUES LESS THAN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THAN的值,同时包括空值。
Sample 1:
假设有个Bank Customer information 表,表中有数据1000000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储500000行,然后将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。
demo 1:

CREATE TABLE TBL_BANK_CUSTOMER_INFO
(
    CUSTOMER_ID        NUMBER NOT NULL PRIMARY KEY,
    CARD_NO            VARCHAR2(19) NOT NULL,
    CUSTOMER_TYPE_ID   VARCHAR2(1) NOT NULL,
    CUSTOMER_NAME      VARCHAR2(30) NOT NULL,
    CUSTOMER_EMAIL     VARCHAR2(80)
)
PARTITION BY RANGE (CUSTOMER_ID)
(
    PARTITION TP_CUSTOMER_INFO1 VALUES LESS THAN (500000) TABLESPACE TBS_DWH_LARGE1,
    PARTITION TP_CUSTOMER_INFO2 VALUES LESS THAN (1000000) TABLESPACE TBS_DWH_LARGE2
);

demo 2:

CREATE TABLE TBL_BANK_CUSTOMER_INFO
(
 	VERSION_DATE      DATE,
    CUSTOMER_ID        NUMBER NOT NULL PRIMARY KEY,
    CARD_NO            VARCHAR2(19) NOT NULL,
    CUSTOMER_TYPE_ID   VARCHAR2(1) NOT NULL,
    CUSTOMER_NAME      VARCHAR2(30) NOT NULL,
    CUSTOMER_EMAIL     VARCHAR2(80)
)
PARTITION BY RANGE (VERSION_DATE)
(
  PARTITION TP_CUSTOMER_INFO1 VALUES LESS THAN (TO_DATE('2022-02-01','YYYY-MM-DD'))  TABLESPACE TBS_DWH_LARGE1,
  PARTITION TP_CUSTOMER_INFO2 VALUES LESS THAN (TO_DATE('2022-03-01','YYYY-MM-DD'))  TABLESPACE TBS_DWH_LARGE2,
  PARTITION TP_CUSTOMER_INFO3 VALUES LESS THAN (TO_DATE('2022-04-01','YYYY-MM-DD'))  TABLESPACE TBS_DWH_LARGE3,
);

demo 3:

CREATE TABLE TBL_BANK_CUSTOMER_INFO
(
 	VERSION_DATE             DATE,
    CUSTOMER_ID        		NUMBER NOT NULL PRIMARY KEY,
    CARD_NO                 VARCHAR2(19) NOT NULL,
    CUSTOMER_TYPE_ID   		VARCHAR2(1) NOT NULL,
    CUSTOMER_NAME       	VARCHAR2(30) NOT NULL,
    CUSTOMER_EMAIL       	VARCHAR2(80),
    MONEY                   NUMBER 
)
PARTITION  BY  RANGE (MONEY)
(
  PARTITION  TP_CUST_INFO1  VALUES  LESS  THAN (1000000)  TABLESPACE  TBS_MAPRJ_LARGE1,
  PARTITION  TP_CUST_INFO2  VALUES  LESS  THAN (5000000)  TABLESPACE  TBS_MAPRJ_LARGE2
);
(2)哈希分区(hash)
(3)列表分区(list)

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

CREATE TABLE TBL_BANK_CUSTOMER_INFO
(
 	VERSION_DATE             DATE,
    CUSTOMER_ID        		NUMBER NOT NULL PRIMARY KEY,
    CUSTOMER_SEX            VARCHAR2(1) NOT NULL,
    CARD_NO                 VARCHAR2(19) NOT NULL,
    CUSTOMER_TYPE_ID   		VARCHAR2(1) NOT NULL,
    CUSTOMER_NAME       	VARCHAR2(30) NOT NULL,
    CUSTOMER_EMAIL       	VARCHAR2(80),
    MONEY                   NUMBER 
)
PARTITION BY LIST (CUSTOMER_SEX)
(  
  PARTITION CUST_MALE    VALUES ('male')     TABLESPACE TBS_CUST_MALE,
  PARTITION CUST_FEMALE  VALUES ('female')   TABLESPACE TBS_CUST_FEMALE
);
(4)范围-哈希复合分区(range-hash)
(5)范围-列表复合分区(range-list)

3. 查询分区、表空间

 select * from dba_tab_partitions  where table_name = upper('tablename1')  order by partition_name  desc; 

4. 删除分区

  alter table tablename1 drop partition partition_name;

5. 分解分区

  alter table tablename1 split partition partition_name at (TO_DATE('2022-02-01','YYYY-MM-DD')) into (partition partition_name1, partition_name);

6. 创建分区

  alter table tablename1 add partition partition_name values less than (TO_DATE('2022-02-01','YYYY-MM-DD'));

7. 查询索引表空间、分区

 select index_name,partition_name,tablespace_name from dba_ind_partitions  where index_name = upper('index_name1')  order by partition_name  desc; 

8. 修改表空间

  alter table tablename1 move partition partition_name tablespace tablespacename;

9. 修改索引表空间

  alter index indexname1 rebuild partition partition_name tablespace tablespacename;

10. 查询表占用的表空间

  select segment_name, Bytes/1024/1024 || 'M' as 'SIZE', tablespace_name from dba_segments order by Bytes/1024/1024 desc;

11. 查询表有多大

  select owner,segment_name, Bytes/1024/1024 || 'M' as 'SIZE', tablespace_name, partition_name   from dba_segments where segment_name = 'tablename1' order by Bytes/1024/1024 desc;

12. 查询free space有多大

  select tablespace_name, sum(Bytes)/1024/1024 || 'M' as 'SIZE', max(Bytes)/1024/1024 from dba_free_space  group by tablespace_name order by 2 desc;
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐