Postgresql之分割槽表

2021-10-21 17:05:26 字數 3048 閱讀 1069

參考:

建立步驟(注意:以下針對10.0版本之前的用法,新版本見:

1、建立主表。不用為該錶定義任何檢查限制,除非需要將該限制應用到所有的分割槽表中。同樣也無需為該錶建立任何索引和唯一限制。

create table almart

( date_key date,

hour_key smallint,

client_key integer,

item_key integer,

account integer,

expense numeric

);

2、建立多個分割槽表。每個分割槽表必須繼承自主表,並且正常情況下都不要為這些分割槽表新增任何新的列。

create table almart_2015_12_10 () inherits (almart);

create table almart_2015_12_11 () inherits (almart);

create table almart_2015_12_12 () inherits (almart);

create table almart_2015_12_13 () inherits (almart);

3、為分割槽表新增限制。這些限制決定了該表所能允許儲存的資料集範圍。這裡必須保證各個分割槽表之間的限制不能有重疊。

alter table almart_2015_12_10

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-10'::date);

alter table almart_2015_12_11

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-11'::date);

alter table almart_2015_12_12

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-12'::date);

alter table almart_2015_12_13

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-13'::date);

4、為每乙個分割槽表,在主要的列上建立索引。

alter table almart_2015_12_10

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-10'::date);

alter table almart_2015_12_11

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-11'::date);

alter table almart_2015_12_12

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-12'::date);

alter table almart_2015_12_13

add constraint almart_2015_12_10_check_date_key

check (date_key = '2015-12-13'::date);

5、定義乙個trigger或者rule把對主表的資料插入操作重定向到對應的分割槽表。

--建立分割槽函式

create or replace function almart_partition_trigger()

returns trigger as $$

begin

if new.date_key = date '2015-12-10'

then

insert into almart_2015_12_10 values (new.*);

elsif new.date_key = date '2015-12-11'

then

insert into almart_2015_12_11 values (new.*);

elsif new.date_key = date '2015-12-12'

then

insert into almart_2015_12_12 values (new.*);

elsif new.date_key = date '2015-12-13'

then

insert into almart_2015_12_13 values (new.*);

elsif new.date_key = date '2015-12-14'

then

insert into almart_2015_12_14 values (new.*);

end if;

return null;

end;

$$language plpgsql;

--掛載分割槽trigger

create trigger insert_almart_partition_trigger

before insert on almart

for each row execute procedure almart_partition_trigger();

需要注意的是:

我們需要確保postgresql.conf中的constraint_exclusion配置項沒有被disable。

思考:表分割槽是如何加速查詢優化的呢?

當constraint_exclusion為on或者partition時,查詢計畫期會跟據分割槽表的檢查限制將對主表的查詢限制在符合檢查限制條件的分割槽表上,直接避免了對不符合條件的分割槽表的掃瞄。

postgresql中的分割槽表

在早期的版本中pg中的分割槽表都是通過繼承的方式建立的,通過繼承的方式來建立分割槽表的這種方式用起來不是很方便。mydb create table parent id int primary key,name varchar 100 create table mydb create index id...

資料庫之分割槽表

如果一張表的資料量太大的話,那麼myd,myi就會變得很大,查詢資料就會變得很慢,這個時候我們可以利用mysql的分割槽功能,在物理上將這一張表對應的三個檔案,分割成許多個小塊,這樣呢,我們查詢一條資料時,就不用全部查詢了,只要知道這條資料在哪一塊,然後在那一塊找就行了。如果表的資料太大,可能乙個c...

MySQL高階特性之分割槽表

對於使用者而言,分割槽表是乙個獨立的邏輯表,但是在底層由多個物理子表組成。實現分割槽的 實際上是對一組底層表的控制代碼物件的封裝,對分割槽表的請求都會通過控制代碼物件轉化成對儲存引擎的介面呼叫 mysql在建立表的時候可以通過使用partition by子句定義每個分割槽存放的資料。在執行查詢的時候...