首页 文章

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

提问于
浏览
0

相当新的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';

Problem:

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

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

2 回答

  • 2

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

    要解决此问题,您需要通过对连接使用“ON”子句来定义/约束两个表之间的关系,或者它可以放在WHERE子句中 .

  • 0

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

    因此,通过不指定ON子句来匹配table1和table2中的记录,可以将table1中的每条记录与table2中的每条记录进行匹配 . 这可能很多:-)

相关问题