MPP数据库分区表详解
本文介紹的MPP數(shù)據(jù)庫(kù)是greenplum database,根據(jù)gp官網(wǎng)介紹gp支持大表分區(qū)。
參考文獻(xiàn):gp官網(wǎng)
一、分區(qū)的目的:提高查詢效率
二、 分區(qū)類型
三、 分區(qū)策略
1.表是否足夠大?
大事實(shí)表可以選擇分區(qū)。如果一個(gè)表有幾百萬(wàn)或10億數(shù)據(jù)量,你可以看到性能上的優(yōu)勢(shì)。
如果只是幾千行或者更小的表的話,dba將在維護(hù)分區(qū)花費(fèi)大量的精力,小表不要建分區(qū),直接fulltable scan。
2.是否對(duì)現(xiàn)有性能不滿意?
當(dāng)表的查詢響應(yīng)時(shí)間比預(yù)期要慢的話,可以考慮用分區(qū)表
3.是否能夠判斷查詢可以使用固定范圍或固定值來(lái)做限定條件?
where子句中是否使用分區(qū)字段。
例如:經(jīng)常按日志來(lái)查詢,可以按月或周來(lái)范圍分區(qū)。或按地區(qū)來(lái)查的話,可以按地區(qū)來(lái)做列表分區(qū)。
4.是否需要維護(hù)你數(shù)據(jù)倉(cāng)庫(kù)中的大量歷史記錄?
分區(qū)設(shè)計(jì)另外一個(gè)考量是根據(jù)業(yè)務(wù)要求來(lái)決定歷史數(shù)據(jù)的保存。
例如:數(shù)據(jù)倉(cāng)庫(kù)只要保留過(guò)去12個(gè)月的數(shù)據(jù)。如果是按月分區(qū)的話,你很容易刪掉歷史分區(qū)并載入數(shù)據(jù)到當(dāng)前幾個(gè)月份中。
5.是否能基于一些定義規(guī)則將數(shù)據(jù)分成等份?
你應(yīng)該選擇盡可能的將數(shù)據(jù)等分。如果分區(qū)中包含等數(shù)量記錄,則查詢性能提升基于已創(chuàng)建的分區(qū)數(shù)量。
例如:一個(gè)大表被分成10個(gè)分區(qū),執(zhí)行一個(gè)查詢將比非分區(qū)表快10倍。
四、具體語(yǔ)句
[時(shí)間范圍分區(qū)]
兩中創(chuàng)建方式:
(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’) ); --時(shí)間間隔
(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 ); --在最后要寫(xiě)個(gè)end
[數(shù)字范圍分區(qū)]
(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);
[列表分區(qū)]
(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);
------多級(jí)分區(qū)------
(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 (‘a(chǎn)sia’),
DEFAULTSUBPARTITION other_regions
)
( START (2002) END(2010) EVERY (1),
DEFAULTPARTITION outlying_years
);
------選擇性分區(qū)掃描的一些限制-----
限制條件:
條件中使用簡(jiǎn)單直接的限制操作符(如:= < <= > >= <>),可以選擇性掃描分區(qū)
不能識(shí)別變化性函數(shù),只能是固定值
例如:where語(yǔ)句中 date >current_date可以做范圍掃描。 但是time > timeofday則不行。
不確定的值是無(wú)法做runtime評(píng)估,必須要指定明確的值
例如:SELECT * frompartition_table PT, other_table OT WHERE
PT.id=OT.idand OT.some_column = 'value';--value必須指定值------查看表分區(qū)-------
pg_partitions - 查看創(chuàng)建分區(qū)信息
pg_partition_templates -查看是用subpartition模板創(chuàng)建的子分區(qū)
pg_partition_column - 查看分區(qū)字段
select * from pg_partitions where tablename=‘sales’
總結(jié)
以上是生活随笔為你收集整理的MPP数据库分区表详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows10下怎么关闭 wsapp
- 下一篇: 简单的抽卡模拟器2.0