Vertica系列 表的分段和分割槽

2021-09-07 18:16:01 字數 3370 閱讀 1036

vertica 有兩個資料分布的概念, segmentation 和 partition, 至少有下面幾個區別:

1.目的方面:

segmentation 解決各節點資料傾斜問題, 適用於木桶原理, 資料量大的那個節點將會拖慢整個查詢.

partition 主要解決的是資料刪除和空間**問題. 列式資料庫刪除資料的代價較大. 相比一條一條記錄的刪除動作, 刪除整乙個partition 的代價要小得多(其實乙個partition就是乙個檔案). 當然一般情況下,分割槽也會在一定程度上改善查詢效率.

2.data locality 方面:

segmentation 是指資料在集群中各個節點的分布, 理想狀態應該是資料均勻分布到各個節點.

partition 是指資料在單個節點上的分布.

3.ddl方面:

segmentation 是可在create table 和 create projection 語句中指定的, superprojection的segment是在建表語句中指定.

partition只能在create table 語句中指定的.

********************====

分割槽設計規則:

********************====

1. 按照 purge data的策略確定分割槽規則. 因為分割槽乙個優勢是快速**空間, 所以可按照刪除資料的方式確定如何分割槽, 比如將來是按月purge data,分割槽就選擇月份; 如果將來可能按照年份purge data, 分割槽就選擇年份. 而且, 建立分割槽的表示式應該和purge資料(即刪除partition)的表示式一致.

2. 確保這個表的分割槽數量不能超過1024個. vertica 乙個partition就是乙個檔案, vertica要求partition不能超過1024個, 所以一般情況下不推薦直接使用日期欄位做分割槽, 推薦使用月份等較大的時間跨度. partition 子句可以使用表示式.

********************====

segment規則:

********************====

1. segment目的是要將資料在各個節點中平均分布, 所以最好是選擇那些選擇性好的字段或字段組合. 字段取值可以包含null, 但需注意null的記錄將被分布到同乙個節點, null值太多的話, 可能會引起資料傾斜問題.

2. 在新建表的時候, 最好是指定 segment 策略. 如果建表時未指定segment策略的話, 表的superprojection會自動按照前32個字段作segemnt, 後果是: 一旦乙個欄位被包含到segment策略中, vertica將不允許alter該欄位, 包括擴充套件長度.

segment子句的語法是:

segmented by hash(column_key) all nodes;

segmented by hash(column_key,column_data_01,column_data_02) all nodes;

********************====

乙個推薦的建表示例

********************====

下面的例子中, 使用了sequence作為segment欄位, 既簡單有能很好地保證資料分布的均勻性. 使用了訂單年+訂單月作為partition.

create sequence mydb.order_seq;

create table mydb.order(

orderid numeric(38,0)

,orderdate date

,ordertime timestamp

,productname varchar(30)

,amount numeric(38,5)

,eutime timestamp default sysdate()

,eid numeric(38,0) default nextval('mydb.order_seq')

)order by orderid

segmented by hash(eid) all nodes

partition by ((date_part('year', orderdate) * 10000) + (date_part('month', orderdate) * 100)) ;

;********************====

其他一些相關的語句

********************====

檢查資料傾斜率的語句:

select /*+label(source: www.dbjungle.com )*/ node_name , projection_name , row_count

from projection_storage

where anchor_table_name = 'my_table'

and anchor_table_schema = 'my_schema'

order by projection_name , node_name ;

查詢所有分割槽表的清單

select table_schema, owner_name, table_name, partition_expression

from tables

where partition_expression<>''

;刪除分割槽的語法:

select drop_partition('some_table', partition_value);

-- 示例1: 按天分割槽的示例

create table t_day(

col1 int,

col2 varchar,

col3 timestamp not null)

partition by (extract(year from col3)*10000 + extract(month from col3)*100 + extract(day from col3));

--按天分割槽,刪除2015-08-01這一時間的分割槽資料

select drop_partition('test.t_day', 20150801);

-- 示例2: 按天day of year分割槽 (doy)

create table t_jingyu_doy(

col1 int,

col2 varchar,

col3 timestamp not null)

partition by (date_part('doy', col3));

--按天分割槽(doy),刪除」2015-08-01」這一時間的分割槽資料

select drop_partition('test.t_jingyu_doy', extract('doy' from '2015-08-01'::date));

參考:部落格<

sql中的分段列表

表 使用者號碼,登入時間 顯示 每日登入各時間段的登入人數,和每天登入人數 if isnull object id tb drop table tb create table tb 列名1 varchar 12 時間 datetime insert into tb select 0317419018...

linux分段引導程式 Linux的分段和分頁機制

寫在前面 上半部分為一般原理,即先分段再分頁,作業系統和組成原理上都應該有 下半部分為linux的保護模式,邏輯位址 對映 線性位址的原理。1.分段機制 80386的兩種工作模式 80386的工作模式包括實位址模式和虛位址模式 保護模式 linux主要工作在保護模式下。分段機制 在保護模式下,803...

分段和分頁的區別

這兩天把湯子瀛的 現代作業系統 儲存器管理認真看了一遍。在分頁分段方面有點點個人的想法。首先申明,我雖然上過作業系統的課,不過沒聽過課,這可以說是首次接觸,如果有啥錯誤請大家指正 書上說 頁和分段系統有許多相似之處,但在概念上兩者完全不同,主要表現在 1 頁是資訊的物理單位,分頁是為實現離散分配方式...