全部產品
Search
文件中心

ApsaraDB for OceanBase (Deprecated):設定分區策略

更新時間:Jan 05, 2026

本文檔旨在介紹分區建立策略和分區刪除策略。

分區建立策略

重要
  • 如果表屬於表組(tablegroup),建立分區可能會失敗或破壞負載平衡,請謹慎配置建立策略。

  • 建立索引可能會導致表組(tablegroup)失效,因為同屬於一個表組的表必須擁有完全一致的分區,而建立分區可能會破壞這種現狀,導致表組失效。

自訂分區建立策略

自訂分區建立策略是通過 SQL 運算式來產生分區的上界,分為以下 3 個步驟:

  1. 通過 SQL 運算式擷取基準時間:基準時間是指分區產生時所依賴的起始時間。

    說明

    以分區計劃啟動並執行時間為起始時間:直接使用now()或者sysdate

  2. 定義分區產生的間隔:分區計劃將會以此間隔作為分區產生的時間步長以產生若干個分區。您在間隔輸入框中輸入所需間隔後,ODC 通過${INTERVAL}運算式引用該間隔,並且將該間隔加入到步驟 1 所產生的 SQL 運算式中。

  3. 產生對應分區鍵類型的分區運算式:將步驟 1 和步驟 2 產生的時間類型的 SQL 運算式轉換成對應分區鍵真實的類型(如果對應分區鍵的類型與 SQL 運算式的類型相同,可忽略此步驟)。

自訂分區建立策略中支援變數引用,目前支援的運算式如下:

運算式名

說明

樣本

INTERVAL

時間間隔,用以描述分區產生時的步長。ODC 在運行時會將該變數引用替換為 建立規則 > 細則 > 間隔 中的內容。

${INTERVAL}

通常情況下,如果您採用 自訂 方式建立分區策略表示需要將非時間類型分區鍵按照時間類型的方式遞增產生新的分區。下表可以協助您快速寫出正確的 SQL 運算式:

分區上界產生運算式速查表 - MySQL 模式

分區運算式範例

說明

間隔

分區上界計算 SQL 運算式

... values less than ('2024')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y''')

... values less than ('202401')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y01''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y%m''')

... values less than ('2024-01')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y-01''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y-%m''')

... values less than ('2024/01')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y/01''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y/%m''')

... values less than ('20240101')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y0101''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y%m01''')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '''%Y%m%d''')

... values less than ('2024-01-01')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y-01-01''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01''')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d''')

... values less than ('2024/01/01')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y/01/01''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01''')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d''')

... values less than ('2024-01-01 00:00:00')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y-01-01 00:00:00''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01 00:00:00''')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d 00:00:00''')

... values less than ('2024/01/01 00:00:00')

按年產生

1

date_format(now() + interval ${INTERVAL} year, '''%Y/01/01 00:00:00''')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01 00:00:00''')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d 00:00:00''')

... values less than (2024)

按年產生

1

date_format(now() + interval ${INTERVAL} year, '%Y')

... values less than (202401)

按年產生

1

date_format(now() + interval ${INTERVAL} year, '%Y01')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '%Y%m')

... values less than (20240101)

按年產生

1

date_format(now() + interval ${INTERVAL} year, '%Y0101')

按月產生

1

date_format(now() + interval ${INTERVAL} month, '%Y%m01')

按日產生

1

date_format(now() + interval ${INTERVAL} day, '%Y%m%d')

... values less than (1709222400)

註:Unix 時間戳記

按年產生

1

unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} year, '%Y-01-01 00:00:00'), '%Y-%m-%d %H:%i:%s'))

按月產生

1

unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} month, '%Y-%m-01 00:00:00'), '%Y-%m-%d %H:%i:%s'))

按日產生

1

unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} day, '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s'))

分區上界產生運算式速查表 - Oracle 模式

分區運算式範例

說明

間隔

分區上界計算 SQL 運算式

... values less than ('2024')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY''')

... values less than ('202401')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM''')

... values less than ('2024-01')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM''')

... values less than ('2024/01')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM''')

... values less than ('20240101')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01""01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM"01"''')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMMDD''')

... values less than ('2024-01-01')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01"''')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD''')

... values less than ('2024/01/01')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01"''')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD''')

... values less than ('2024-01-01 00:00:00')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01 00:00:00"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01 00:00:00"''')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD "00:00:00"''')

... values less than ('2024/01/01 00:00:00')

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01 00:00:00"''')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01 00:00:00"''')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD "00:00:00"''')

... values less than (2024)

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY')

... values less than (202401)

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01"')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM')

... values less than (20240101)

按年產生

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01""01"')

按月產生

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM"01"')

按日產生

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMMDD')

順序遞增分區建立策略

順序遞增可以針對數字、時間和字元類型的分區鍵進行便捷管理操作。順序遞增的基準時間可以目前時間和指定時間為準,按照使用者配置的時間間隔順序產生新的分區。

image

分區名建置原則

使用者可以通過不同的策略產生分區名,分區名的產生和分區的內容相關聯。

分區計劃目前提供 2 種分區名建置原則:

  • 首碼加尾碼策略:首碼是一個字串常量,尾碼是針對日期型分區運算式的引用,使用者可以通過修改首碼和尾碼的內容,基準時間以及輸出格式來擷取不同的分區名。

    image

    重要

    該策略僅對日期型的分區鍵有效。尾碼引用指定分區鍵對應的 SQL 運算式的值,由於限定了引用的分區鍵是時間類型,因此其對應的 SQL 運算式可以被轉換成時間,最後再格式化輸出為分區名的尾碼部分。

  • 自訂策略:該策略通過 SQL 運算式產生符合使用者要求的分區名。在命名運算式中可以通過${分區鍵}的方式引用分區鍵對應分區運算式的值。

    image

下述為常見分區名的產生運算式速查表,ODC 僅支援速查數字類型和字元類型的分區鍵。

分區名產生運算式速查表 - MySQL 模式

待引用分區運算式樣本

命名規則運算式

預覽

... values less than (..., 2024, ...)

concat('P', ${分區鍵})

P2024

... values less than (..., '2024', ...)

... values less than (..., 202401, ...)

concat('P', ${分區鍵})

P202401

... values less than (..., '202401', ...)

... values less than (..., '2024-01', ...)

date_format(str_to_date(concat(${分區鍵}, '-01'), '%Y-%m-%d'), 'P%Y%m')

P202401

date_format(str_to_date(concat(${分區鍵}, '-01'), '%Y-%m-%d'), 'P%Y_%m')

P2024_01

... values less than (..., '2024/01', ...)

date_format(str_to_date(concat(${分區鍵}, '/01'), '%Y/%m/%d'), 'P%Y%m')

P202401

date_format(str_to_date(concat(${分區鍵}, '/01'), '%Y/%m/%d'), 'P%Y_%m')

P2024_01

... values less than (..., 20240101, ...)

concat('P', ${分區鍵})

P20240101

... values less than (..., '20240101', ...)

... values less than (..., '2024-01-01', ...)

date_format(str_to_date(${分區鍵}, '%Y-%m-%d'), 'P%Y%m%d')

P20240101

date_format(str_to_date(${分區鍵}, '%Y-%m-%d'), 'P%Y_%m_%d')

P2024_01_01

... values less than (..., '2024/01/01', ...)

date_format(str_to_date(${分區鍵}, '%Y/%m/%d'), 'P%Y%m%d')

P20240101

date_format(str_to_date(${分區鍵}, '%Y/%m/%d'), 'P%Y_%m_%d')

P2024_01_01

... values less than (..., '2024-01-01 00:00:00', ...)

date_format(str_to_date(${分區鍵}, '%Y-%m-%d %H:%i:%s'), 'P%Y%m%d')

P20240101

date_format(str_to_date(${分區鍵}, '%Y-%m-%d %H:%i:%s'), 'P%Y_%m_%d')

P2024_01_01

... values less than (..., '2024/01/01 00:00:00', ...)

date_format(str_to_date(${分區鍵}, '%Y/%m/%d %H:%i:%s'), 'P%Y%m%d')

P20240101

date_format(str_to_date(${分區鍵}, '%Y/%m/%d %H:%i:%s'), 'P%Y_%m_%d')

P2024_01_01

... values less than (..., 1709222400, ...)

註:時間戳記,單位:秒

date_format(from_unixtime(${分區鍵}), 'P%Y')

P2024

date_format(from_unixtime(${分區鍵}), 'P%Y%m')

P202401

date_format(from_unixtime(${分區鍵}), 'P%Y_%m')

P2024_01

date_format(from_unixtime(${分區鍵}), 'P%Y%m%d')

P20240101

date_format(from_unixtime(${分區鍵}), 'P%Y_%m_%d')

P2024_01_01

分區名產生運算式速查表 - Oracle 模式

待引用分區運算式樣本

命名規則運算式

預覽

... values less than (..., 2024, ...)

concat('P', ${分區鍵})

P2024

... values less than (..., '2024', ...)

... values less than (..., 202401, ...)

concat('P', ${分區鍵})

P202401

... values less than (..., '202401', ...)

... values less than (..., '2024-01', ...)

TO_CHAR(TO_DATE(CONCAT(${分區鍵}, '-01'), 'YYYY-MM-DD'), '"P"YYYYMM')

P202401

TO_CHAR(TO_DATE(CONCAT(${分區鍵}, '-01'), 'YYYY-MM-DD'), '"P"YYYY_MM')

P2024_01

... values less than (..., '2024/01', ...)

TO_CHAR(TO_DATE(CONCAT(${分區鍵}, '/01'), 'YYYY/MM/DD'), '"P"YYYYMM')

P202401

TO_CHAR(TO_DATE(CONCAT(${分區鍵}, '/01'), 'YYYY/MM/DD'), '"P"YYYY_MM')

P2024_01

... values less than (..., 20240101, ...)

concat('P', ${分區鍵})

P20240101

... values less than (..., '20240101', ...)

... values less than (..., '2024-01-01', ...)

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY-MM-DD'), '"P"YYYYMMDD')

P20240101

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY-MM-DD'), '"P"YYYY_MM_DD')

P2024_01_01

... values less than (..., '2024/01/01', ...)

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY/MM/DD'), '"P"YYYYMMDD')

P20240101

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY/MM/DD'), '"P"YYYY_MM_DD')

P2024_01_01

... values less than (..., '2024-01-01 00:00:00', ...)

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY-MM-DD HH24:MI:SS'), '"P"YYYYMMDD')

P20240101

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY-MM-DD HH24:MI:SS'), '"P"YYYY_MM_DD')

P2024_01_01

... values less than (..., '2024/01/01 00:00:00', ...)

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY/MM/DD HH24:MI:SS'), '"P"YYYYMMDD')

P20240101

TO_CHAR(TO_DATE(${分區鍵}, 'YYYY/MM/DD HH24:MI:SS'), '"P"YYYY_MM_DD')

P2024_01_01

分區刪除策略

重要
  • 如果表包含全域索引,刪除分區會導致全域索引失效,請謹慎操作;如果選擇重建全域索引可能因耗時較久導致業務問題,或者重建全域索引失敗導致線上問題。

  • 重建全域索引選項僅對 Oracle 模式有效,MySQL 模式下無此選項,因 MySQL 模式下預設會重建全域索引。

  • 分區刪除策略需要考慮預建立分區的影響,避免因為分區預建立而導致的歷史分區誤刪。例如:目標表按月分區,想保留過去 12 個月的分區,分區保留數目中輸入 12,假設此時建立策略預建立 3 個月的分區,那麼實際將保留過去 9 個月和未來 3 個月的分區。

分區刪除策略是針對已經存在的分區,目前支援以下幾項配置:

  • 分區保留數量:保留最近的 N 個分區,即刪除最近 N 個分區外的其他分區。

  • 設定分區資料保留時間:刪除分區時,需確保該分區的上界小於設定的保留時間點;否則不予刪除。

  • 刪除後是否重建索引:用於控制刪除分區後是否自動重建索引,以保證索引的完整性和查詢效能。

樣本:

  1. 建立order表且表中包含p2023_01p2023_02兩個分區。

    CREATE TABLE `order` (
    `time` date NOT NULL,
    `parti_key` int(11),
     `name` varchar(120) DEFAULT NULL
    ) partition by range columns(time, parti_key)
    (partition p2023_01 values less than ('2023-01-01', 20230101),
    partition p2023_02 values less than ('2023-02-01', 20230201))
  2. order表配置分區刪除策略。

    image

  3. 根據分區刪除策略形成的分區刪除語句將會刪除p2023_01分區。

注意事項

  • 如果表屬於表組(tablegroup),建立分區可能會失敗或破壞負載平衡,請謹慎配置建立策略。

  • 建立索引可能會導致表組(tablegroup)失效,因為同屬於一個表組的表必須擁有完全一致的分區,而建立分區可能會破壞這種現狀,導致表組失效。

  • 如果表包含全域索引,刪除分區會導致全域索引失效,請謹慎操作;如果選擇重建全域索引可能因耗時較久導致業務問題,或者重建全域索引失敗導致線上問題。

  • 重建全域索引選項僅對 Oracle 模式下有效,MySQL 模式下無此選項,因 MySQL 模式下預設會重建全域索引。

相關文檔