【问题标题】:Vertica Hierarchical Partitioned Table creation throws errorVertica 分层分区表创建引发错误
【发布时间】:2019-08-29 12:51:13
【问题描述】:


我正在使用 Vertica 分析数据库 v8.1.1-8
我创建了一个带有简单分区子句的表:

创建表 public.test ( id 时间戳不为空, cid numeric(37,15) NOT NULL DEFAULT 0 ) 按 id::DATE 未分割所有节点分区;

表已成功创建,我在其中插入了几行。 但是当我执行以下 SQL 时,

SELECT DUMP_PARTITION_KEYS();

我看到以下内容:

Partition keys on node v_public_node0001
  Projection 'test_super'
   No of partition keys: 0

 Partition keys on node v_public_node0003
  Projection 'test_super'
   No of partition keys: 0

我期待一定有一些有效的“分区键”。
因此,想知道我是否错过了这里的任何一步?

如何验证我的表是否真的被“分区”了?

2) 接下来我尝试了使用 CALENDAR_HIERARCHY_DAY 元函数的“分层分区”来利用分区分组。 但是这个时间表创建本身失败了。

创建表 public.test ( id 时间戳不为空, cid numeric(37,15) NOT NULL DEFAULT 0 ) 未分段的所有节点分区按 id::DATE GROUP BY CALENDAR_HIERARCHY_DAY(id::DATE, 2, 2);

出现以下错误:

16:45:14  [CREATE - 0 rows, 0.130 secs]  [Code: 4856, SQL State: 42601]  [Vertica][VJDBC](4856) ERROR: Syntax error at or near "GROUP"
... 1 statement(s) executed, 0 rows affected, exec/fetch time: 0.130/0.000 sec  [0 successful, 1 errors]

任何人都可以请。建议我做错了什么?
我的目标是创建一个带有分层分区的表。

提前非常感谢,
- 昆塔尔

【问题讨论】:

    标签: partitioning vertica hierarchical


    【解决方案1】:

    1) 插入后没有立即看到分区键的原因是分区只发生在磁盘上(每个节点,每个投影)。当您向表中插入行时,这些行将被写入写入优化存储 (WOS) 或内存中。在给定的时间间隔之后,内存中的数据 (WOS) 被写入磁盘或读取优化存储 (ROS)。此时您将看到分区键。

    数据从 WOS 复制到 ROS 的过程由元组移动器 (https://www.vertica.com/docs/latest/HTML/Content/Authoring/Glossary/TupleMover.htm) 执行。

    简而言之,要查看分区键,要么等待 5 分钟左右,让元组移动器启动自动 moveout,或者您可以通过执行手动 moveout 来强制将 WOS 中的数据写入 ROS。

    SELECT DO_TM_TASK('moveout', 'public.test');
    

    然后你应该看到钥匙了。

    2) 分层分区是 Vertica 9 的一项功能。您需要至少升级到 Vertica 9.0 才能使用该功能。

    https://www.vertica.com/blog/whats-new-vertica-9-0-hierarchical-partitioning/

    【讨论】:

    • 非常感谢 Saunders - 现在我确实看到了分区键。
    • @javauser71 很高兴为您提供帮助。我希望这能澄清一点 Vertica 架构。如果我已经充分回答了这个问题,您能否将其标记为已接受?否则让我知道是否还有其他需要解释的地方。谢谢!
    • 我还有一个问题。由于我已经按日期对数据进行了分区,所以如果我想查询特定日期的数据,我是否需要在我的 SQL 中提及任何特定于分区的参数?还是简单的日期列的值会提示 Vertica 从该特定分区检索数据?例如,SELECT * from test where id >= '2019-03-07 00:00:00' and id
    • @javauser71 Vertica 将为您处理分区修剪。您的示例将起作用。 Vertica 将识别出您正在对分区列进行过滤,并会自动为您修剪分区。要进行验证,请运行您的查询,然后查询query_events 系统表并在event_type 列中查找STORAGE_CONTAINERS_ELIMINATED。请注意,出于性能考虑,我将按 INT 而不是 DATE 进行分区。这样做的方法是:PARTITION BY (DATE_PART('year', id) * 10000 + DATE_PART('month', id) * 100 + DATE_PART('day', id))::INT.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2015-11-07
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多