閱讀133 返回首頁    go 阿裏雲


3.3 創建和修改表__第三章 DDL_使用手冊_分析型數據庫-阿裏雲

在快速開始中,我們已經大概了解了在如何通過iDB Cloud創建和修改表。在這一節中,我們將詳細描述如何通過DDL創建和修改表。

由於分析型數據庫有一些傳統關係型數據庫沒有的特性,所以分析型數據庫的DDL在遵循類MySQL規範的基礎上,有不少的獨有的屬性和語法。分析型數據庫中創建事實表DDL語法結構如下:

  1. CREATE TABLE db_name.table_name (
  2. col1 bigint COMMENT 'col1',
  3. col2 varchar COMMENT 'col2',
  4. col3 int COMMENT 'col3',
  5. col4 bigint COMMENT 'col4',
  6. col5 multivalue COMMENT 'col5 多值列',
  7. [primary key (col1, col3)]
  8. )
  9. PARTITION BY HASH KEY(col1)
  10. PARTITION NUM 50
  11. [SUBPARTITION BY LIST (part_col2 long)]
  12. [SUBPARTITION OPTIONS (available_partition_num = 30)]
  13. [CLUSTERED BY (col3,col4)]
  14. TABLEGROUP ads_test ;
  15. [options (updateType='{realtime | batch}')]

其中’[]’中的內容為視情況填寫的可選項。創建事實表(也就是非維度表)時,必須指定的是一個數據庫名(db_name)和表名(table_name),以及至少一列的列信息,至少一個分區的信息以及一個表組。

首先,根據表的數據更新方式不同,分析型數據庫的表根據updateType分為批量更新表(僅能夠離線批量更新數據)和實時更新表(能夠通過insert/delete實時更新數據),用updateType以區分,如果updateType選項不填則默認為批量更新表。需要注意的是,updateType=realtime暨為實時更新表時,必須指定合法的主鍵並且不能有二級分區。

列信息的基本格式為”列名 類型 COMMENT ‘注釋’”,關於列的更多屬性,請參照後文3.4節。”[primary key (col1, col3)]”一段指定了表的主鍵,如果表為批量更新的,則主鍵沒有意義,而表為實時更新的,則必須指定主鍵並且主鍵中必須含有一級Hash分區列(可以是聯合主鍵)。

關於分區方麵,目前分析型數據庫支持最多兩級分區,並且一級分區僅支持HASH分區,二級分區僅支持LIST分區。HASH分區是一種動態分區值類型,暨根據實際數據中的某一列的內容進行分區。所以在語法上,一級HASH分區的用法是:

  1. PARTITION BY HASH KEY(col1)
  2. PARTITION NUM 50

其中col1為需要進行分區的列名,必須是表中實際存在的列。’PARTITION NUM’為分區數量,一般根據該表的數據量確定,每個分區一般不超過1500萬條記錄為宜(亦可通過劃分二級分區實現無限擴展)。另外HASH分區列的數據分布要盡可能均勻,不能有非常明顯的傾斜(暨分區列值),否則會較嚴重的影響查詢性能。

一定需要注意的一點:目前分析型數據庫要求一個表組下所有表的一級分區數目一致,所以建立第一張表時指定一級分區數量時請謹慎。一級分區數量默認不能超過256個。

另外需要注意的是,若一張表僅有一級HASH分區並且是批量導入的表,則每次導入數據時會對已有進行全量覆蓋。若需要每次導入數據時增量導入,則需要再指定二級List分區信息:

  1. SUBPARTITION BY LIST (part_col2 bigint)
  2. SUBPARTITION OPTIONS (available_partition_num = 30)

二級List分區為非動態分區,暨分區值不是由數據本身決定的,而是由每次導入/寫入數據時用戶指定的。所以在進行分區信息定義時需要指定一個和現有數據中的列不同的新列名,以及這個列的類型(目前僅支持long)。二級分區有一個可選屬性,available_partition_num,即為最大保留的二級分區數,當新的數據裝載進來後,若線上存在的二級分區數大於這個值,那麼會根據二級分區的值進行排序,下線最小的若幹分區的數據。

0.8版本的實時更新表暫不支持二級分區,0.9版本支持。但是實時更新表的二級分區僅用於極大的擴展單表容量,以及進行生命周期管理,實時更新表的增量更新不依賴於二級分區。

慣常的用法是,將經常需要進行Join的列(例如買家ID)作為一級Hash分區列,而將日期列作為二級分區列。這樣的表既可以進行大表Join的加速,又可以每天進行增量數據導入,並且指定保留若幹天的數據在線上來進行生命周期管理。

但是,一級分區數量和二級分區數量的設置,並不是越多越好的。而是要看表的數據量,以及數據庫擁有的資源數。若一級二級分區過多而數據庫的資源數過少,則很容易讓分區的數據Meta將內存耗盡。

CLUSTERED BY子句用於指定聚集列,用戶可以把一列或者多列指定為聚集列,注意如果指定多列,那麼該表的數據聚集順序按照DDL中這個子句中指定的列組合順序進行排序。通常,我們將一個表的查詢中肯定會涉及到的並且數據區分度很大的列設置為聚集列,有時候能較顯著的提升查詢性能。

事實表的創建上,默認有如下限製:(1)一張事實表至少有一級Hash分區並且分區數不能小於8個;(2)一個事實表組最多可以創建256個事實表;(3)一個事實表最多不能超過1024個列。

與創建事實表相比,創建維度表要簡單的多:

  1. CREATE DIMENSION TABLE db_name.dim_table_name (
  2. col1 int comment 'col1',
  3. col2 varchar comment 'col2'
  4. [primary key (col1)]
  5. )
  6. [options (updateType='{realtime | batch}')]
  7. ;

創建維度表時隻需要指定數據庫名和表名即可,維度表會創建到統一的維度表組,並且無需指定分區信息。

在表已經創建好之後,目前支持有限的修改:主要是支持增加列。

  1. ALTER TABLE db_name.table_name ADD column col_new varchar;

注意,批量導入表新增加的列在數據重新裝載後才會生效,實時寫入表新增列後,一般需要幾分鍾後才可以讀寫。

最大二級分區數目前可以在建表後進行修改,但是修改後的下一次數據導入發起後才會生效:

  1. ALTER TABLE db_name.table_name subpartition_available_partition_num = N

N為新的二級分區數。

最後更新:2016-11-23 16:03:54

  上一篇:go 3.2 創建和修改表組__第三章 DDL_使用手冊_分析型數據庫-阿裏雲
  下一篇:go 3.4 列的類型和屬性__第三章 DDL_使用手冊_分析型數據庫-阿裏雲