内存分配失败:如何将四个结果集合并到一个表中

时间:2016-12-20 09:29:03

标签: sql hana sql-scripts

我有四张桌子。每个表只有一列,32768行,如:

|calculated|
|2.45644534|
|3.23323567|
[...]

现在我想将这四个结果/表组合成一个包含四列的表,如:

|calc1|calc2|calc3|calc4|
[values]

没有用于标识唯一行的ID或其他内容。 这是我的问题:

   SELECT A.*, B.*, C.*, D.*
    FROM
        (
            SELECT * FROM :REAL_RESULT
        ) AS A
    JOIN
        (
            SELECT * FROM :PHASE_RESULT
        ) AS B
    ON 1=1
    JOIN
        (
            SELECT * FROM :AMPLITUDE_RESULT
        ) AS C
    ON 1=1 [...]

现在服务器抛出了这个错误:

  

错误:(dberror)2048 - 列存储错误:搜索表错误:   “TEST”。“data :: fourier”:第58行   col 4(at pos 1655):[2048](范围3):列存储错误:搜索   表错误:[9]内存分配失败

我现在能做什么?还有其他选择吗?谢谢!

2 个答案:

答案 0 :(得分:0)

在原始代码中执行的操作实际上是四个表上的交叉连接,每个表包含2 ^ 15行。结果大小将包含2 ^ 60行,相当于几PB ...这就是OOM的原因。我使用了一个类似的例子来向同事们展示在连接条件错误的情况下加入大表时会发生什么。 除此之外,SQL是基于设置的,您的行没有任何自然顺序。

如果表是列存储表,则可以在技术上加入内部列$ rowid $。但$ rowid $没有正式记录,因此我不建议使用它。

克雷格建议的清洁解决方案。我可能会使用IDENTITY列。

答案 1 :(得分:0)

如果此交叉加入不是您的初衷,但您想加入一个没有任何实际连接条件的值列表,您可以尝试使用UNION:

SELECT COLUMN,0,0,0 from A
union all
SELECT 0,COLUMN,0,0 from B
union all
SELECT 0,0,COLUMN,0 from C
union all
SELECT 0,0,0,COLUMN from D

输出将是这些表的所有记录的总和。