Vertica數據庫中的表只是一個邏輯概念。
實際存儲在磁盤上的是projection。 當創建一張表,沒有創建projection時,那么插入數據的時候會自動創建一個默認的projection。如果運行中發現projection不合適,可以運行dbd進行優化,得出一些建議,參考來重建projection。
如果清楚projection如何建立最優,那么建表的時候就可以在插入數據之前直接手動建立對應的projection。
Projection
Optimized collections of table columns that provide physical storage for data. A projection can contain some or all of the columns of one or more tables. A projection that contains all of the columns of a table is called a super-projection. A projection that joins one or more tables is called a pre-join projection.
導出Vertica庫中原有的建表語句:
例如導出test用戶下的t_jingyu表的建表語句到/tmp/t_jingyu.sql文件(需要dbadmin用戶登錄vsql操作):
select export_objects('/tmp/t_jingyu.sql','test.t_jingyu');
vertica建分區表:
按doy分區:
create table t_jingyu(
col1 int,
col2 varchar,
col3 timestamp not null)
PARTITION BY (date_part('doy', t_jingyu.col3));
這樣的分區表卸載時:
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2015-04-01'::date));
按月分區:
create table t_jingyu(
col1 int,
col2 varchar,
col3 timestamp not null)
partition by EXTRACT(year FROM col3)*100 + EXTRACT(month FROM col3);
插入測試數據:
insert into t_jingyu values(1,11,sysdate-1);
insert into t_jingyu values(1,11,sysdate);
insert into t_jingyu values(2,11,sysdate-33);
commit;
這樣的分區表卸載時:
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('year' FROM '20150401'::date)*100 + EXTRACT('month' FROM '20150401'::date));
上面就是刪除201504的分區。
創建Projection:
CREATE PROJECTION t_jingyu
(
col1,
col2,
col3
)
AS
SELECT * FROM t_jingyu
ORDER BY col3, col1
SEGMENTED BY hash(col3) ALL NODES KSAFE 1;