天天看點

Greenplum介紹 - Partitioned Table

GP支援分區表,主要用來存放大表,如fact table

目的:

1. 把大資料切片,便于查詢

2. 便于資料庫維護

分區建立時,每個分區會自帶一個Check限制,來限定資料的範圍。Check限制也用于 執行查詢時定位分區。

支援分區類型:

1. 範圍分區 range partition

2. 清單分區 list partition

3. 組合分區

Greenplum介紹 - Partitioned 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))

    ( 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)

    PARTITION BY RANGE (year)

    ( START (2001) END (2008) EVERY (1),

    DEFAULT PARTITION extra );

[清單分區]

    char(1), count int )

    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 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)

     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