2

我已经构建了一个存储过程,它构建一个内存临时表A,然后通过循环遍历标准游标的结果来用数据填充它。通过数据库中其他 MyISAM 表的多个连接将数据选择到临时表中。SP 工作正常,但运行时遇到了完整的表内存限制。为了解决这个问题,我提高了内存限制:

set @@tmp_table_size=127108864; (121MEGs)
set @@max_heap_table_size=127108864; (121MEGs)

这是关于让我的 SP 成功运行所需的内容。这对我来说似乎很奇怪,因为A创建和返回的表(通过从 A 中选择 *)只有 16MEG 大小。我不确定是什么导致了内存需求的另一部分,大约是 100MEG。似乎 SP 使用的内存比需要的多。我的猜测是,作为游标循环的一部分在 SP 中运行的连接在运行后会留下临时表,并且在 SP 完成执行之前不会清理这些临时表。这意味着大量连接的临时表在内存中浮动。有什么方法可以阻止这种情况或验证这些在 SP 游标循环内运行的连接是否正在吸收额外的内存?这种糟糕的记忆可能来自其他东西吗?感谢任何提供帮助的人。

4

1 回答 1

1

根据您的查询,mysql 可以创建多个临时表,因此 - 在您的每个查询上使用 EXPLAIN EXTENDED 来查找创建它的原因

于 2013-10-11T21:54:26.423 回答