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));

参考:
博客<<Vertica删除历史分区数据>> http://www.cnblogs.com/jyzhao/p/3978582.html

Vertica系列: 表的分段和分区的更多相关文章

  1. 大数据系列之数据仓库Hive中分区Partition如何使用

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  2. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  3. mysql表分区(摘自 MySQL表的四种分区类型)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  4. Hive 7、Hive 的内表、外表、分区(22)

    Hive 7.Hive 的内表.外表.分区   1.Hive的内表 Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.h ...

  5. Hive 7、Hive 的内表、外表、分区

    1.Hive的内表 Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.html 中已经提到: 2.Hive的外表 创建H ...

  6. Vertica系列: 自动生成Identity 字段值的方法

    参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...

  7. (1.5)MySQL表的5种分区类型

    (1.5)MySQL表的5种分区类型 关键词:mysql表分区    小细节: (1)Null 将会放入最小范围区间 (2)无论哪种类型的分区,要么没有主键.唯一键,要么分区表的主键/唯一键都必须包含 ...

  8. mysql分区表之二:MySQL的表的四种分区类型介绍

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  9. ORACLE表、索引和分区详解

    ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...

随机推荐

  1. 【题解】 bzoj3555: [Ctsc2014]企鹅QQ (字符串Hash)

    题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...

  2. HihoCoder 1511: 树的方差(prufer序)

    题意 对于一棵 \(n\) 个点的带标号无根树,设 \(d[i]\) 为点 \(i\) 的度数,定义一棵树的方差为数组 \(d[1..n]\) 的方差. 给定 \(n\) ,求所有带标号的 \(n\) ...

  3. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  4. (转)深入理解Java注解类型(@Annotation)

    背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...

  5. '新', '泽' - ImageMagick - UTF-8非最短形式及编码安全问题

    最近偶然发现,把软件放到 [新建文件夹]  中,ImageMagick 竟无法正常的加载图片了. 我去!什么情况? 抛出的错误是找不到相关的dll,软件中已对中文进行了utf-8编码,这几年来一直没发 ...

  6. django(八)之数据库表的一对多,多对多表-增删改查

    单表操作 表记录的添加 方式一: Book() b=Book(name="python基础",price=99,author="yuan",pub_date=& ...

  7. mybatis源码分析(方法调用过程)

    十一月月底,宿舍楼失火啦,搞得20多天没有网,目测直到放假也不会来了... 正题 嗯~,其实阅读源码不是为了应付面试,更重要的让你知道,大师是怎样去写代码的,同样是用Java,为啥Clinton Be ...

  8. poj 2385 Apple Catching(记录结果再利用的动态规划)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有两颗苹果树,在每一时刻只有其中一棵苹果树会掉苹果,而Bessie可以在很短的时 ...

  9. vue $refs的基本用法

    <div id="app"> <input type="text" ref="input1"/> <butto ...

  10. IE缓存查看的方法

    选择设置中的Internet选项中, 然后点击查看文件: 最终缓存目录: