MPP数据库分区表详解
本文介紹的MPP數據庫是greenplum database,根據gp官網介紹gp支持大表分區。
參考文獻:gp官網
一、分區的目的:提高查詢效率
二、 分區類型
三、 分區策略
1.表是否足夠大?
大事實表可以選擇分區。如果一個表有幾百萬或10億數據量,你可以看到性能上的優勢。
如果只是幾千行或者更小的表的話,dba將在維護分區花費大量的精力,小表不要建分區,直接fulltable scan。
2.是否對現有性能不滿意?
當表的查詢響應時間比預期要慢的話,可以考慮用分區表
3.是否能夠判斷查詢可以使用固定范圍或固定值來做限定條件?
where子句中是否使用分區字段。
例如:經常按日志來查詢,可以按月或周來范圍分區。或按地區來查的話,可以按地區來做列表分區。
4.是否需要維護你數據倉庫中的大量歷史記錄?
分區設計另外一個考量是根據業務要求來決定歷史數據的保存。
例如:數據倉庫只要保留過去12個月的數據。如果是按月分區的話,你很容易刪掉歷史分區并載入數據到當前幾個月份中。
5.是否能基于一些定義規則將數據分成等份?
你應該選擇盡可能的將數據等分。如果分區中包含等數量記錄,則查詢性能提升基于已創建的分區數量。
例如:一個大表被分成10個分區,執行一個查詢將比非分區表快10倍。
四、具體語句
[時間范圍分區]
兩中創建方式:
(1)CREATE TABLE sales (id int, date date, amtdecimal(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’) ); --時間間隔
(2)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
[數字范圍分區]
(1)CREATE TABLE rank (id int, rank int, yearint, gender
char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE(year)
( START (2001) END(2008) EVERY (1),
DEFAULT PARTITION extra);
[列表分區]
(1)CREATE TABLE rank (id int, rank int, yearint, gender
char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST(gender) --可以使用多列
( PARTITION girlsVALUES (‘F’),
PARTITIONboys VALUES (‘M’),
DEFAULT PARTITION other);
------多級分區------
(1)CREATE TABLE sales (id int, year int,month int, day int,region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BYRANGE (month)
SUBPARTITIONTEMPLAT
(
START(1) END (13) EVERY (1),
DEFAULTSUBPARTITION other_months
)
SUBPARTITION BYLIST (region)
SUBPARTITIONTEMPLATE
(
SUBPARTITIONusa VALUES (‘usa’),
SUBPARTITIONeurope VALUES (‘europe’),
SUBPARTITIONasia VALUES (‘asia’),
DEFAULTSUBPARTITION other_regions
)
( START (2002) END(2010) EVERY (1),
DEFAULTPARTITION outlying_years
);
------選擇性分區掃描的一些限制-----
限制條件:
條件中使用簡單直接的限制操作符(如:= < <= > >= <>),可以選擇性掃描分區
不能識別變化性函數,只能是固定值
例如:where語句中 date >current_date可以做范圍掃描。 但是time > timeofday則不行。
不確定的值是無法做runtime評估,必須要指定明確的值
例如:SELECT * frompartition_table PT, other_table OT WHERE
PT.id=OT.idand OT.some_column = 'value';--value必須指定值------查看表分區-------
pg_partitions - 查看創建分區信息
pg_partition_templates -查看是用subpartition模板創建的子分區
pg_partition_column - 查看分區字段
select * from pg_partitions where tablename=‘sales’
總結
以上是生活随笔為你收集整理的MPP数据库分区表详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows10下怎么关闭 wsapp
- 下一篇: MPP数据库简介及架构分析