慢速查询占用整个硬盘空间,导致“1030来自存储引擎的错误28”

时间:2014-05-19 13:38:15

标签: mysql sql innodb mysql-error-1030

相当新的MySQL。

慢速查询会占用整个硬盘空间,最终会出现1030错误代码。

INSERT INTO schema.Table C
SELECT a.`Date`, a.Store, a.SKU, 
       floor((a.QTY / ((b.CASEQTY * b.CASEPERLAYER) * b.LAYERPERPALLET))) AS Pallets,
       floor(((a.QTY / ((b.CASEPERLAYER * b.LAYERPERPALLET) * b.CASEQTY)) /.CASEQTY)) AS Cases,
       (a.QTY * b.CASEQTY) AS Pieces
FROM
    (schema.table1 AS a
    INNER JOIN schema.table2 AS b)
    WHERE a.Description = 'BLAH';

问题:

当我运行上述查询时,我得到了我需要的结果,在0.01秒内限制为100行。但是,当我尝试将查询插入准备好的表时,它会失败。

上述查询基本上会运行几个小时,直到硬盘已满。表A包含数百万条记录,表B仅包含数千条记录。存储引擎是InnoDB。我已经运行了3小时的类似查询并且已经成功了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

这在MySQL中很特别。尽管称之为 INNER JOIN ,但您可以通过省略ON子句来执行 CROSS JOIN ,这正是您正在做的事情。 (另一个dbms会引发语法错误。)

因此,如果不指定ON子句来匹配table1和table2中的记录,则将table1中的每个记录与table2中的每个记录进行匹配。这可能很多: - )

答案 1 :(得分:0)

您的内部联接语句不包含联接条件。这将导致一些(坏的)称为“笛卡尔积”"。因此,如果表A有一百万条记录而表b包含一千条,那么笛卡尔积将匹配表A中的每一行到另一个表中的每一行。这应该给你(至少)十亿条记录。

要解决此问题,您需要使用" ON"来定义/约束两个表之间的关系。您的联接的子句或它可以在WHERE子句中。