閱讀968 返回首頁    go iPhone_iPad_Mac_手機_平板_蘋果apple


range分區__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲

語法

  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. 經常運行直接依賴於用於分割表的列的查詢。

最後更新:2016-11-24 11:23:46

  上一篇:go OceanBase SQL簡介__SQL語法參考_雲數據庫 OceanBase-阿裏雲
  下一篇:go hash分區__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲