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

Posted

技术标签:

【中文标题】内存分配失败:如何将四个结果集合并到一张表中【英文标题】:Memory allocation failed: How to combine four result sets into one table 【发布时间】:2016-12-20 09:29:02 【问题描述】:

我有四张桌子。每个表只有一列 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 - 列存储错误:搜索表错误: “测试”。“数据::傅立叶”:第 58 行 col 4(位置 1655):[2048](范围 3):列存储错误:搜索 表错误:[9] 内存分配失败

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

【问题讨论】:

首先添加列以用作 ID ...。它使许多问题消失了。 Just do it! 现在就做! ;) @CraigYoung 好吧...好吧..这很好。谢谢..如果您想获得一些积分,请将其添加为答案...就这样做;) :) 好吧,它并没有真正回答你的问题;很高兴它在路上轻推了你。不幸的是,我现在要退出了;所以没有办法。 【参考方案1】:

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

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

克雷格提出了一个干净的解决方案。我可能会使用 IDENTITY 列。

【讨论】:

【参考方案2】:

如果这个交叉连接不是你的初衷,但你想加入一个没有任何实际连接条件的值列表,你可以试试 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

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

【讨论】:

以上是关于内存分配失败:如何将四个结果集合并到一张表中的主要内容,如果未能解决你的问题,请参考以下文章

tsql 将列合并到一张表中

Pentaho CDE Dashbord:如何通过单击按钮将多个表格导出到一张表中

如何从一张表中获得我想要的视图结果

如何将SQL Server中多个表的数据一次性返回到一张EXCEL工作表(Sheet)中

mysql 从相同类型的多张表中提取到一张表中

将多张 Excel 表格中的数据合并到一张表中