【问题标题】:Error while running very long SQL query with UNION ALL operator in Vertica在 Vertica 中使用 UNION ALL 运算符运行很长的 SQL 查询时出错
【发布时间】:2021-08-19 09:18:36
【问题描述】:

这是 Vertica Query 中使用的子查询示例,它是从应用程序生成的字符串。

SELECT 1 as ID, 345.45 as PaidAmt FROM DUAL
UNION ALL 
SELECT 2 as ID, 789.45 as PaidAmt FROM DUAL
UNION ALL
...
...

在某些情况下,随着使用 UNION ALL 的行数增加,此子查询会变得很大。 Vertica 在一定程度上支持这种查询。但是,如果在子查询中使用 3000 + UNION ALL 运算符,则会引发错误。

[SQL 错误 [4963] [54001]:[Vertica]VJDBC 错误:查询 包含太复杂而无法分析的 SET 操作树

我找不到任何有关在查询中限制使用 UNION ALL 运算符或查询字符串长度的文档。

Vertica 或 Linux 中是否有任何系统参数可以更改其值以成功执行查询?

我有另一种方法来修复删除 UNION ALL 的查询。但正在寻找产生错误的解决方案。

提前致谢!

【问题讨论】:

  • 更好的长期解决方案是将这些数据作为 SQL 数据库中的真实表进行维护。您可以使用 Vertica 的 CSV 加载工具(很确定它有一个)。
  • @TimBiegeleisen - 是的,作为快速解决方案之一,我们正在创建一个表来保存信息并在查询中使用该表。另外,我想出了一个替代查询来以这种方式删除 UNION ALL 的实现。更改将需要时间在应用程序中实施。但是想知道是否有任何其他替代方法可以通过更改某种可变参数(如果有)来使查询执行成为可能。谢谢!

标签: sql union vertica


【解决方案1】:

如果 CSV 选项被证明是不可能的,我会使用一个临时表 - 它还会加快您的查询速度:

CREATE LOCAL TEMPORARY TABLE helper_table(id,paidamt)
ON COMMIT PRESERVE ROWS AS
          SELECT 1, 345.45 
UNION ALL SELECT 2, 789.45 
UNION ALL SELECT 3, 213.44
[.2997 more rows . .]
;

INSERT INTO helper_table
          SELECT 3001, 4345.45 
UNION ALL SELECT 3002, 3789.45 
UNION ALL SELECT 3003, 1213.44
[.2997 more rows . .]
;

SELECT
  <<whatever>>
FROM helper_table JOIN <<other_tables>> ON <<whatever>> 
;

一旦您再次注销,helper_table 就会消失。

或者,将 vsql 与如下脚本一起使用:

CREATE LOCAL TEMPORARY TABLE helper_table (
  id      INT
, paidamt NUMERIC(9,2)
)
ON COMMIT PRESERVE ROWS;

COPY helper_table FROM stdin;
   1|  345.45 
   2|  789.45 
   3|  213.44
3001| 4345.45 
3002| 3789.45 
3003| 1213.44
\.

-- Now you can work with it ...
SELECT * FROM helper_table;

【讨论】:

  • 谢谢!我们正在实施一种类似的方法作为查询的快速修复替代方案。但我想知道 - Vertica 或 Linux 中是否有某种参数可以通过更改其参数值来解决问题(按原样执行查询)?
  • 答案是:不。检查此链接:vertica.com/docs/10.1.x/HTML/Content/Authoring/…。我还认为,由数千个 UNION SELECT 组成的表表达式在任何基于 SQL 的数据库中对资源的使用效率都非常低....
  • 感谢您的链接。正如它所提到的 - “第二个限制是分析表达式中可能的递归数。限制是 2000。如果超过此限制,则可能会抛出错误“查询包含的表达式太复杂而无法分析”。这个限制不能增加。”
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多