Greenplum介紹-PartitionedTable

塵光掠影發表於2018-04-12

GP支援分割槽表,主要用來存放大表,如fact table
目的:
1. 把大資料切片,便於查詢
2. 便於資料庫維護

分割槽建立時,每個分割槽會自帶一個Check約束,來限定資料的範圍。Check約束也用於 執行查詢時定位分割槽。


支援分割槽型別
1. 範圍分割槽 range partition
2. 列表分割槽 list partition
3. 組合分割槽

Greenplum介紹 <wbr>- <wbr>Partitioned <wbr>Table
                                      (多級分割槽表)

——-partition 和 distribution的區別——
distribution — 物理上拆分表資料、能並行執行查詢
partition — 邏輯上拆分大表資料提高查詢效能、利於資料倉儲維護工作

 

——表分割槽策略——
@ 表是否足夠大?
  大事實表可以選擇分割槽。如果一個表有幾百萬或10億資料量,你可以看到效能上的優勢。
  如果只是幾千行或者更小的表的話,dba將在維護分割槽花費大量的精力,小表不要建分割槽,直接full table scan。
@ 是否對現有效能不滿意?
  當表的查詢響應時間比預期要慢的話,可以考慮用分割槽表
@ 是否能夠判斷查詢可以使用固定範圍或固定值來做限定條件?
  where子句中是否使用分割槽欄位。
  例如:經常按日誌來查詢,可以按月或周來範圍分割槽。或按地區來查的話,可以按地區來做列表分割槽。
@ 是否需要維護你資料倉儲中的大量歷史記錄?
  分割槽設計另外一個考量是根據業務要求來決定歷史資料的儲存。
  例如:資料倉儲只要保留過去12個月的資料。如果是按月分割槽的話,你很容易刪掉歷史分割槽並載入資料到當前幾個月份中。
@ 是否能基於一些定義規則將資料分成等份?
  你應該選擇儘可能的將資料等分。如果分割槽中包含等數量記錄,則查詢效能提升基於已建立的分割槽數量。
  例如:一個大表被分成10個分割槽,執行一個查詢將比非分割槽錶快10倍。

 

——建立分割槽表——
[時間範圍分割槽]
2中建立方式:
==》CREATE TABLE sales (id int, date date, amt decimal(10,2))
    DISTRIBUTED BY (id)
    PARTITION BY RANGE (date)
   ( START (date `2008-01-01`) INCLUSIVE
     END (date `2009-01-01`) EXCLUSIVE
     EVERY (INTERVAL `1 day`) ); –時間間隔
==> CREATE TABLE sales (id int, date date, amt decimal(10,2))
    DISTRIBUTED BY (id)
    PARTITION BY RANGE (date)
    ( PARTITION Jan08 START (date `2008-01-01`) INCLUSIVE ,
    PARTITION Feb08 START (date `2008-02-01`) INCLUSIVE ,
    PARTITION Mar08 START (date `2008-03-01`) INCLUSIVE ,
    PARTITION Apr08 START (date `2008-04-01`) INCLUSIVE ,
    PARTITION May08 START (date `2008-05-01`) INCLUSIVE ,
    PARTITION Jun08 START (date `2008-06-01`) INCLUSIVE ,
    PARTITION Jul08 START (date `2008-07-01`) INCLUSIVE ,
    PARTITION Aug08 START (date `2008-08-01`) INCLUSIVE ,
    PARTITION Sep08 START (date `2008-09-01`) INCLUSIVE ,
    PARTITION Oct08 START (date `2008-10-01`) INCLUSIVE ,
    PARTITION Nov08 START (date `2008-11-01`) INCLUSIVE ,
    PARTITION Dec08 START (date `2008-12-01`) INCLUSIVE
    END (date `2009-01-01`) EXCLUSIVE ); –在最後要寫個end
 
[數字範圍分割槽]
==>CREATE TABLE rank (id int, rank int, year int, gender
    char(1), count int)
    DISTRIBUTED BY (id)
    PARTITION BY RANGE (year)
    ( START (2001) END (2008) EVERY (1),
    DEFAULT PARTITION extra );

[列表分割槽]
==>CREATE TABLE rank (id int, rank int, year int, gender
    char(1), count int )
    DISTRIBUTED BY (id)
    PARTITION BY LIST (gender) –可以使用多列
    ( PARTITION girls VALUES (`F`),
      PARTITION boys VALUES (`M`),
    DEFAULT PARTITION other );

——多級分割槽——
==>CREATE TABLE sales (id int, year int, month int, day int,
   region text)
   DISTRIBUTED BY (id)
   PARTITION BY RANGE (year)
     SUBPARTITION BY RANGE (month)
     SUBPARTITION TEMPLATE (
        START (1) END (13) EVERY (1),
        DEFAULT SUBPARTITION other_months )
     SUBPARTITION BY LIST (region)
     SUBPARTITION TEMPLATE (
      SUBPARTITION usa VALUES (`usa`),
      SUBPARTITION europe VALUES (`europe`),
      SUBPARTITION asia VALUES (`asia`),
      DEFAULT SUBPARTITION other_regions )
    ( START (2002) END (2010) EVERY (1),
        DEFAULT PARTITION outlying_years );

 

——普通表 轉 分割槽表 ——-
==>CREATE TABLE sales2 (LIKE sales)
   PARTITION BY RANGE (date)
   ( START (date `2008-01-01`) INCLUSIVE
     END (date `2009-01-01`) EXCLUSIVE
     EVERY (INTERVAL `1 month`) );
==>INSERT INTO sales2 SELECT * FROM sales;
==>DROP TABLE sales;
==>ALTER TABLE sales2 RENAME TO sales;
==>GRANT ALL PRIVILEGES ON sales TO admin;
==>GRANT SELECT ON sales TO guest;


——選擇性分割槽掃描的一些限制—–
限制條件:
1. 條件中使用簡單直接的限制操作符(如:=  <  <=  >  >=  <>),可以選擇性掃描分割槽
2. 不能識別變化性函式,只能是固定值
   例如:where語句中 date > current_date可以做範圍掃描。 但是time > timeofday則不行。
3. 不確定的值是無法做runtime評估,必須要指定明確的值
   例如:SELECT * from partition_table PT, other_table OT WHERE
         PT.id=OT.id and OT.some_column = `value`;
   –value必須指定值
  
——檢視錶分割槽——-
pg_partitions  – 檢視建立分割槽資訊
pg_partition_templates – 檢視是用subpartition模板建立的子分割槽
pg_partition_column – 檢視分割槽欄位

關於修改表分割槽的語法,參考官方文件。

原文網址:http://blog.sina.com.cn/s/blog_90474a9201013k74.html