zoukankan      html  css  js  c++  java
  • Vertica系列: 表的分段和分区

    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

  • 相关阅读:
    Custom Settings.in 配置信息收集
    DPM恢复点和保持期、常见问题排除指南
    裸机恢复 (BMR) 和系统状态恢复
    远程桌面开启(命名空间)
    RPC终结点映射
    远程计算机 进程/服务 启动停止(WMI)
    环境变量、语言类型转换、静态类、字符串
    密封管理包
    PowerShell管理SCOM2007R2
    PowerShell管理SCOM_批量设置维护模式(上 )
  • 原文地址:https://www.cnblogs.com/harrychinese/p/vertica_segment_partition.html
Copyright © 2011-2022 走看看