全部產品
Search
文件中心

MaxCompute:分區表概述

更新時間:Sep 16, 2025

分區表是指擁有分區空間的表,即將表資料按照某個列或多個列進行劃分,從而使表中的資料分散儲存在不同的物理位置上。合理設計和使用分區,可以提高查詢效能、簡化資料管理,同時支援更靈活的資料訪問與操作。

分區表類型

MaxCompute支援普通分區表和自動分區表(AUTO PARTITION)兩種分區表類型,您可根據不同使用情境所需的分區列產生方式,選擇不同的分區表類型。

  • 普通分區表:直接指定一個或多個分區欄位對錶進行分區。

  • 自動分區表(AUTO PARTITION):分區列基於以下兩種不同方式自動產生。

    自動分區方式

    功能介紹

    基於時間計算函數的自動分區表

    支援使用者對錶中的時間或日期類型(如DATE、DATETIME、TIMESTAMP、TIMESTAMP_NTZ)的資料列使用特定的時間計算函數(TRUNC_TIME),MaxCompute將自動根據資料列計算後的結果產生分區列的值,對錶進行分區。

    基於資料寫入時間的自動分區表

    系統會自動擷取資料寫入MaxCompute的時間,結合使用者指定的時間計算函數(TRUNC_TIME),根據計算後的結果產生分區列的值,對錶進行分區。這種基於資料寫入時間的自動分區表又稱為Ingestion Time Partition表。

使用情境

當您存在以下的使用情境和訴求時,可以考慮對錶進行分區:

  • 提升查詢效能:希望通過僅掃描表的部分資料提高查詢效率,使用分區表能顯著減少資料處理量。

  • 減少查詢成本:MaxCompute支援分區裁剪能力,在查詢前指定分區列的過濾條件,即可在查詢運行時唯讀取部分表分區的資料,避免全表掃描引起的資源浪費。

  • 實現分區層級的資料管理:支援精準的資料寫入和高效的資料刪除能力,在無須全表掃描和不影響表中其他分區的情況下,將資料寫入特定分區或單獨刪除指定分區;同時,可以結合表的生命週期設定,實現分區層級的自動資料清理。

說明

通常情況下,建議單分區的資料量不小於一萬行。若每個分區下的資料量過小,建立過多的小分區將導致計算查詢效能的下降。

使用限制

  • 支援的單表分區層級最多為6級。

  • 支援的單表分區數最大值為60000個。

  • 單次查詢時,允許查詢最多的分區個數為10000個。

  • STRING分區類型的分區值不支援使用中文。

分區列資料類型

  • 在MaxCompute 2.0資料類型版本下,分區欄位支援STRING、TINYINT、SMALLINT、INT、BIGINT、VARCHAR類型。

    MaxCompute的分區值以STRING類型進行儲存。對於非字串類型的分區欄位,其值會在內部被自動轉換為字串類型。為避免因資料類型轉換導致的異常,建議在設計分區欄位時使用STRING類型。

  • 在MaxCompute 1.0資料類型版本下,分區欄位僅支援STRING類型。

    此時雖然也可以指定分區列的類型為BIGINT,但是除了表的欄位顯示為BIGINT類型,任何其他的計算情境中(例如,欄位的計算和比較),該分區列都被當作STRING類型處理。執行如下語句後,返回結果為空白。

    ---建立表parttest。
    CREATE TABLE parttest (a BIGINT) PARTITIONED BY (pt BIGINT);
    
    ---向表中插入資料。
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 1);
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 10);
    
    ---查詢表中欄位pt大於等於2的行。
    SELECT * FROM parttest WHERE pt >= '2';
  • MaxCompute當前不支援時間/日期類型的資料作為分區列,但可使用自動分區表(AUTO PARTITION)能力,基於表中的時間/日期類型的資料進行Function Compute並產生分區,詳情請參見自動分區表(AUTO PARTITION)樣本

普通分區表示例

  1. 建立分區表。

    -- 建立一個普通二級分區表,以日期為一級分區,地區為二級分區
    CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING,region STRING);
  2. 添加分區,並執行INSERT INTO命令向分區表src中追加資料。

    ALTER TABLE src ADD PARTITION (pt='20170506',region='hangzhou') PARTITION (pt='20180101',region='shanghai');
    INSERT INTO src PARTITION (pt='20170506',region='hangzhou') VALUES ('s1',1),('s2',2),('s3',3);
    INSERT INTO src PARTITION (pt='20180101',region='shanghai') VALUES ('c1',4),('c2',5),('c3',6);
  3. 使用分區列作為過濾條件查詢資料。

    • 正確樣本:MaxCompute在產生查詢計劃時只會將一級分區pt='20170506'下的二級分區region='hangzhou'的資料納入輸入中。

      SELECT * FROM src WHERE pt='20170506' AND region='hangzhou'; 

      返回結果如下:

      +------------+-------------+------------+------------+
      | shop_name  | customer_id | pt         | region     |
      +------------+-------------+------------+------------+
      | s1         | 1           | 20170506   | hangzhou   |
      | s2         | 2           | 20170506   | hangzhou   |
      | s3         | 3           | 20170506   | hangzhou   |
      +------------+-------------+------------+------------+
    • 錯誤樣本:在該方式下,MaxCompute並不能保證分區過濾機制的有效性。pt是STRING類型,當STRING類型與BIGINT(20170506)進行比較時,MaxCompute會將二者轉換為DOUBLE類型,此時可能會有精度損失。

      SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou; 

自動分區表(AUTO PARTITION)樣本

有關自動分區表的樣本介紹,請參見以下文檔: