全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多

range分区

更新时间:2017-06-07 13:26:11

语法

  1. ...
  2. PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
  3. (partition_definition [, partition_definition] ...)
  4. partition_definition:
  5. PARTITION partitionname
  6. VALUES {LESS THAN {(expr | value_list) | MAXVALUE}

举例

按照 RANGE 分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。在下面的几个例子中,假定你创建了一个如下的一个表,该表保存有 20 家音像店的职员记录,这20家音像店的编号从1到20。

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT NOT NULL,
  8. store_id INT NOT NULL
  9. );

根据你的需要,这个表可以有多种方式来按照区间进行分区。一种方式是使用store_id 列。例如,你可能决定通过添加一个PARTITION BY RANGE子句把这个表分割成4个区间,如下所示:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT NOT NULL,
  8. store_id INT NOT NULL
  9. )
  10. PARTITION BY RANGE (store_id) (
  11. PARTITION p0 VALUES LESS THAN (6),
  12. PARTITION p1 VALUES LESS THAN (11),
  13. PARTITION p2 VALUES LESS THAN (16),
  14. PARTITION p3 VALUES LESS THAN (21)
  15. );

按照这种分区方案,在商店 1 到 5 工作的雇员相对应的所有行被保存在分区 P0中,商店 6 到 10雇员保存在 P1 中,依次类推。注意,每个分区都是按顺序进行定义,从最低到最高。这是 PARTITION BY RANGE 语法的要求;在这点上,它类似于C或Java中的“switch … case”语句。

对于包含数据(72, ‘Michael’, ‘Widenius’, ‘1998-06-25’, NULL, 13)的一个新行,可以很容易地确定它将插入到 p2 分区中,但是如果增加了一个编号为第 21的商店,将会发生什么呢?在这种方案下,由于没有规则把 store_id 大于 20 的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。 要避免这种错误,可以通过在 CREATE TABLE 语句中使用一个“catchall” VALUES LESS THAN 子句,该子句提供给所有大于明确指定的最高值的值:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT NOT NULL,
  8. store_id INT NOT NULL
  9. )
  10. PARTITION BY RANGE (store_id) (
  11. PARTITION p0 VALUES LESS THAN (6),
  12. PARTITION p1 VALUES LESS THAN (11),
  13. PARTITION p2 VALUES LESS THAN (16),
  14. PARTITION p3 VALUES LESS THAN MAXVALUE
  15. );

MAXVALUE 表示最大的可能的整数值。现在,store_id 列值大于或等于 16(定义了的最高值)的所有行都将保存在分区 p3 中。在将来的某个时候,当商店数已经增长到 25, 30, 或更多,可以使用ALTER TABLE 语句为商店 21-25, 26-30,等等增加新的分区。

在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code 列值的连续区间。例如,假定 2 位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你可以使用下面的语句创建该分区表:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT NOT NULL,
  8. store_id INT NOT NULL
  9. )
  10. PARTITION BY RANGE (job_code) (
  11. PARTITION p0 VALUES LESS THAN (100),
  12. PARTITION p1 VALUES LESS THAN (1000),
  13. PARTITION p2 VALUES LESS THAN (10000)
  14. );

在这个例子中, 店内工人相关的所有行将保存在分区 p0 中,办公室和支持人员相关的所有行保存在分区 p1 中,管理层相关的所有行保存在分区 p2 中。

在 VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是必须能够计算表达式的返回值作为LESS THAN (<)比较的一部分;因此,表达式的值不能为NULL 。由于这个原因,雇员表的hired, separated, job_code和store_id列已经被定义为非空(NOT NULL)。

除了可以根据商店编号分割表数据外,你还可以使用一个基于两个 DATE(日期)中的一个的表达式来分割表数据。例如,假定你想基于每个雇员离开公司的年份来分割表,也就是说,YEAR(separated)的值。实现这种分区模式的 CREATE TABLE 语句的一个例子如下所示:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BY RANGE (YEAR(separated)) (
  11. PARTITION p0 VALUES LESS THAN (1991),
  12. PARTITION p1 VALUES LESS THAN (1996),
  13. PARTITION p2 VALUES LESS THAN (2001),
  14. PARTITION p3 VALUES LESS THAN MAXVALUE
  15. );

在这个方案中,在 1991 年前雇佣的所有雇员的记录保存在分区 p0 中,1991 年到 1995 年期间雇佣的所有雇员的记录保存在分区p1中,1996年到2000年期间雇佣的所有雇员的记录保存在分区 p2 中,2000年后雇佣的所有工人的信息保存在p3中。

使用场景

  1. 当需要删除“旧的”数据时。
  2. 想要使用一个包含有日期或时间值,或包含有从一些其他级数开始增长的值的列。
  3. 经常运行直接依赖于用于分割表的列的查询。
本文导读目录