【问题标题】:Vertica NEXTVAL() function - how to invoke it on a record level by condition?Vertica NEXTVAL() 函数 - 如何按条件在记录级别调用它?
【发布时间】:2021-03-02 12:59:22
【问题描述】:

我正在使用 Vertica 分析数据库 v9.2.1-20,

并尝试使用 NEXTVAL() 函数在记录级别按条件获取下一个序列值。

这里是例子

CREATE SEQUENCE v_seq START 1;

CREATE TABLE test_seq (id INT, flag int);
INSERT INTO test_seq VALUES (1, 0);
INSERT INTO test_seq VALUES (2, 1);
INSERT INTO test_seq VALUES (3, 1);
INSERT INTO test_seq VALUES (4, 0);
INSERT INTO test_seq VALUES (5, 0);
INSERT INTO test_seq VALUES (6, 1);
INSERT INTO test_seq VALUES (7, 1);

SELECT  id,
        flag,
        CASE 
           WHEN flag = 0 THEN NEXTVAL('v_seq') 
           ELSE CURRVAL('v_seq') 
        END as group_id
  FROM test_seq 
ORDER BY ID;

预期结果:

id  flag    group_id
1   0       1
2   1       1
3   1       1
4   0       2
5   0       3
6   1       3
7   1       3

实际结果:

id  flag    group_id
1   0       1
2   1       2
3   1       3
4   0       4
5   0       5
6   1       6
7   1       7

看起来无论 WHEN 条件都在调用 NEXTVAL() 函数。

有什么方法可以按条件调用吗?

谢谢!

【问题讨论】:

    标签: sequence vertica


    【解决方案1】:

    我的几个测试 - 在 Vertica 10 中 - 导致您在上面报告的相同行为。

    似乎没有办法让它做你想做的事。

    正如其他地方所说,您可以使用CONDITIONAL_TRUE_EVENT(flag=0) OVER(ORDER BY id) 来获得您想要的结果。

    存在变慢的风险,因为您的 OLAP 窗口规范中没有 PARTITION BY,因此在大表的情况下运行单线程。

    但是大表会被分段。

    在分段表中,使用seq.nextval,表的每个部分/段将以您使用的不同倍数(默认为 250,000)开始您使用的序列。在节点1中,序列从1开始,在节点2中,序列从250,000开始,在节点3中从500,000开始,等等。如果表不分段,序列生成器也会导致单线程进程,从而惩罚你的表现。所以你不知何故介于岩石和坚硬的地方....

    如果表是分段的,您可以并行化 CONDITIONAL_TRUE_EVENT() 调用,方法是使用基表的分段标准作为 OLAP 函数调用中的 PARTITION BY 标准。

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 2018-10-09
      • 2019-02-23
      • 2016-11-13
      • 1970-01-01
      • 2022-10-16
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多