SQL 错误 (1038): 排序内存不足,请考虑增加服务器排序缓冲区
Posted
技术标签:
【中文标题】SQL 错误 (1038): 排序内存不足,请考虑增加服务器排序缓冲区【英文标题】:SQL Error (1038): Out of sort memory, consider increasing server sort buffer 【发布时间】:2020-10-22 09:33:41 【问题描述】:我已将 MariaDB 10.3.13 升级到最新版本 10.5.6。部署后,我的一个查询开始出现此错误:
SQL 错误 (1038):排序内存不足,请考虑增加服务器排序缓冲区
我设法简化了查询,同时在新安装 10.5.6 时保持错误(默认设置)。这在 10.3.13 上没有问题:
如果存在则删除表 test_products; 创建表 test_products ( product_name VARCHAR(7), id_country INT, PRIMARY KEY (product_name, id_country) ) COLLATE='utf8_general_ci' 引擎=INNODB; 分隔符 // FOR i IN 1..3700 DO INSERT INTO test_products (product_name, id_country) VALUES ('product', i);结束; // 分隔符; 选择 p.product_name、p.id_country、hierarchy.hierarchy FROM test_products p 左连接( SELECT p2.product_name, p2.id_country, h.hierarchy, MAX(test) AS 测试 FROM test_products p2 左连接( SELECT product_name, id_country, '_exactly_' AS hierarchy, 1 AS test -- 从字符串中删除一个字符将使该查询再次工作 FROM test_products ) h ON h.product_name = p2.product_name AND h.id_country = p2.id_country 按产品名称、id_country、h.hierarchy 分组 ) 层次结构 ON hierarchy.product_name = p.product_name AND hierarchy.id_country = p.id_country增加 sort_buffer_size 会有所帮助。但是在原始查询中,我需要将此缓冲区从默认的 2MB 增加到大约 80MB(根本不涉及 ORDER BY;产品表过滤到大约 15k-20k 条目 - 根本不是那么大的数字)。根据https://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/,我宁愿保留原始设置。我也不明白为什么 10.3.13 默认 2MB 缓冲区运行良好,而新版本则不行。 我应该在 MariaDB 上提交错误吗?还是我做错了什么?或者我应该调查一周/两周以简化查询?迷路了。
在 Windows Server 2012R2 上测试;至强 E3-1225@3.2Ghz; 16GB 内存
感谢您的帮助。
【问题讨论】:
两台机器上的索引是否相同? 说的是同一台物理机。 10.3.13 服务名称是“MySql”,而 10.5.6 服务名称是“MariaDB”。它们使用相同的端口,因此一次只能运行一个。我发布的脚本是独立的 - 只有一个主键。在一个版本上运行它可以工作,而在另一个版本上则不行。如果您询问原始查询,那么是的 - 我将数据库从旧版本导出到新版本以保持 100% 相等的条件。 将它作为一个错误提交给 MariaDB 团队 (jira.mariadb.org/browse/…)。他们将优先级更改为关键。应该在 10.5.x 版本中修复 【参考方案1】:这种行为看起来很奇怪,所以我在 MariaDB 团队提交了一个错误。
从 10.5.7 版本开始提供修复。
更多详情请查看https://jira.mariadb.org/browse/MDEV-24015
【讨论】:
以上是关于SQL 错误 (1038): 排序内存不足,请考虑增加服务器排序缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中执行大型 SQL 查询字符串时出现“内存不足”错误
在 Spark SQL 中读取 40 万行时出现内存不足错误 [重复]
ConnectionQueueStatsProvider 出现内存不足错误