oracle数据库分区实现原理 (oracle分库分表原理)

Oracle数据库中 分库分表是一种解决单表数据量过大的方案,在 Oracle 数据库中也有多种实现方式。

  1. 垂直分割:将一张包含多个字段的表按照业务属性拆分为多张表。例如,将订单信息表拆分为订单基本信息表和订单明细表。
  2. 水平分割:将一张表按照数据行进行拆分。例如,将订单信息表按照时间(例如按照年份或月份)分割为多张表。
  3. 分区表:将一张表按照某个字段值范围(例如按照时间区间)进行拆分,每个拆分出来的表称为一个分区,整体形成一个分区表。可以使用分区键来指定分区方式。
  4. 分库:将一张表按照某个字段值(例如按照客户 ID)进行拆分,每个拆分出来的表存放在不同的数据库实例中,整体形成多个分库。
  5. 分布式数据库:通过数据库链接等方式,将多个数据库实例组成一个分布式数据库,其中每个实例负责处理一部分数据,整体形成一个逻辑上的单一数据库。

分库分表的思路

  1. 假设有一张订单信息表 order,其中包括字段 order_id、customer_id、product_id、order_date、quantity 等。由于业务发展,该表的数据量逐渐增大,需要进行分库分表优化。
  2. 首先,可以对订单信息表进行水平分割,按照订单日期进行分割,例如将订单信息表拆分为 order_2019、order_2020、order_2021 等三张表,每张表分别存储对应年份的订单数据。
  3. 接着,可以对订单信息表进行垂直分割,将订单明细信息拆分为 order_detail 表,包括字段 order_id、product_id、order_date、quantity。同样地,也对订单基本信息进行拆分,包括字段 order_id、customer_id、order_date。这样,一个原始的大型表被拆分为多个小型表。
  4. 然后,可以对订单信息表进行分区,按照订单日期对表进行分区,以便更快地查询某个时间段内的订单数据。例如,可以对 order_2021 表按照月份进行分区,每个分区存储一个月份的订单数据,方便统计、查询和管理。
  5. 最后,可以对订单信息表进行分库,按照客户 ID 分库,将订单数据根据不同客户存储到不同的数据库实例中。例如,将客户 ID 以偶数和奇数的方式分别存储到两个库中,以便更好地进行负载均衡和故障恢复。

1. 创建订单信息表

CREATE TABLE order_info (
  order_id       NUMBER(10)   NOT NULL,
  customer_id    NUMBER(10)   NOT NULL,
  product_id     NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  quantity       NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_info PRIMARY KEY (order_id)
);

2. 水平分割表:按照年份分割表(如 order_2019, order_2020, order_2021)

-- 创建分区键
ALTER TABLE order_info ADD order_date_yr NUMBER(4);

-- 创建分区表:order_2019
CREATE TABLE order_2019 (
  order_id       NUMBER(10)   NOT NULL,
  customer_id    NUMBER(10)   NOT NULL,
  product_id     NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  quantity       NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_2019 PRIMARY KEY (order_id)
)
PARTITION BY RANGE (order_date_yr)
(
  PARTITION p2019 VALUES LESS THAN (2020)
);

-- 创建分区表:order_2020
CREATE TABLE order_2020 (
  order_id       NUMBER(10)   NOT NULL,
  customer_id    NUMBER(10)   NOT NULL,
  product_id     NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  quantity       NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_2020 PRIMARY KEY (order_id)
)
PARTITION BY RANGE (order_date_yr)
(
  PARTITION p2020 VALUES LESS THAN (2021)
);

-- 创建分区表:order_2021
CREATE TABLE order_2021 (
  order_id       NUMBER(10)   NOT NULL,
  customer_id    NUMBER(10)   NOT NULL,
  product_id     NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  quantity       NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_2021 PRIMARY KEY (order_id)
)
PARTITION BY RANGE (order_date_yr)
(
  PARTITION p2021 VALUES LESS THAN (2022)
);

3. 垂直分割表:将订单明细信息拆分为 order_detail 表和订单基本信息拆分为 order_basic_info 表

-- 创建订单明细信息表
CREATE TABLE order_detail (
  order_id       NUMBER(10)   NOT NULL,
  product_id     NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  quantity       NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_detail PRIMARY KEY (order_id)
);

-- 创建订单基本信息表
CREATE TABLE order_basic_info (
  order_id       NUMBER(10)   NOT NULL,
  customer_id    NUMBER(10)   NOT NULL,
  order_date     DATE         NOT NULL,
  CONSTRAINT pk_order_basic_info PRIMARY KEY (order_id)
);

4. 分区表:对 order_2021 表按照月份进行分区,每个分区存储一个月份的订单数据

-- 创建分区键
ALTER TABLE order_2021 ADD order_date_month NUMBER(2);

-- 创建分区表:order_2021
CREATE TABLE order_2021 (
  order_id           NUMBER(10)   NOT NULL,
  customer_id        NUMBER(10)   NOT NULL,
  product_id         NUMBER(10)   NOT NULL,
  order_date         DATE         NOT NULL,
  quantity           NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_2021 PRIMARY KEY (order_id)
)
PARTITION BY RANGE (order_date_month)
(
  PARTITION p202101 VALUES LESS THAN (2),
  PARTITION p202102 VALUES LESS THAN (3),
  PARTITION p202103 VALUES LESS THAN (4),
  PARTITION p202104 VALUES LESS THAN (5),
  PARTITION p202105 VALUES LESS THAN (6),
  PARTITION p202106 VALUES LESS THAN (7),
  PARTITION p202107 VALUES LESS THAN (8),
  PARTITION p202108 VALUES LESS THAN (9),
  PARTITION p202109 VALUES LESS THAN (10),
  PARTITION p202110 VALUES LESS THAN (11),
  PARTITION p202111 VALUES LESS THAN (12),
  PARTITION p202112 VALUES LESS THAN (13)
);

5. 分库:将客户 ID 以偶数和奇数的方式分别存储到两个库中

这里为了简化示例,只创建了两个表空间,实际使用时需要根据实际情况创建更多的表空间。

 创建偶数客户 ID 的表空间
CREATE TABLESPACE ts_even
  DATAFILE '/u01/app/oracle/oradata/db1/ts_even.dbf'
  SIZE     50M
  AUTOEXTEND ON;

-- 创建奇数客户 ID 的表空间
CREATE TABLESPACE ts_odd
  DATAFILE '/u01/app/oracle/oradata/db1/ts_odd.dbf'
  SIZE     50M
  AUTOEXTEND ON;

-- 创建偶数客户 ID 的订单信息表
CREATE TABLE order_even (
  order_id           NUMBER(10)   NOT NULL,
  customer_id        NUMBER(10)   NOT NULL,
  product_id         NUMBER(10)   NOT NULL,
  order_date         DATE         NOT NULL,
  quantity           NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_even PRIMARY KEY (order_id)
)
TABLESPACE ts_even
PARTITION BY RANGE (customer_id)
(
  PARTITION peven VALUES LESS THAN (10000000),
  PARTITION podd  VALUES LESS THAN (20000000)
);

-- 创建奇数客户 ID 的订单信息表
CREATE TABLE order_odd (
  order_id           NUMBER(10)   NOT NULL,
  customer_id        NUMBER(10)   NOT NULL,
  product_id         NUMBER(10)   NOT NULL,
  order_date         DATE         NOT NULL,
  quantity           NUMBER(5)    NOT NULL,
  CONSTRAINT pk_order_odd PRIMARY KEY (order_id)
)
TABLESPACE ts_odd
PARTITION BY RANGE (customer_id)
(
  PARTITION podd  VALUES LESS THAN (10000000),
  PARTITION peven VALUES LESS THAN (20000000)

oracle数据库平均分语句,oracle分库分表

整理不易,欢迎点赞收藏转发,关注我每天分享运维小知识