如何解决Vertica NEXTVAL() 函数 - 如何按条件在记录级别调用它?
我使用的是 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
看起来 NEXTVAL() 函数正在被调用,而不管 WHEN 条件如何。
有没有办法通过条件调用它?
谢谢!
解决方法
我的几个测试 - 在 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 标准。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。