执行select order by查询报Out of sort memory
场景描述
执行以下查询报Out of sort memory,调大sort_buffer_size仍然报错,排查表数量较小
SELECT * FROM `t1` WHERE num = 4250 ORDER BY rank desc; 执行失败,失败原因:(conn=24259576) Out of sort memory, consider increasing server sort buffer size
原因分析
查看表结构发现存在JSON格式的大字段
create table `t1` ( `id` bigint not null, `num` int not null, `rank` int not null, `j1` json default null, `j2` json default null, `j3` json default null, primary key (`id`, `num`)) engine = InnoDB default charset = utf8
社区全字段排序特性导致该问题,对于BLOB/TEXT/JSON/GEOMETRY等大字段类型,虽然理论上最大可以达到4GB,但是在实际应用中基本不会达到这个数量级,如果只根据row IDs去做排序而不是完整的行,会导致需要二次回表去取数据,在这种场景下瓶颈就在回表上。因此如果开启了全字段排序,当sort_buffer_size比较小而行数据比较大,就会导致超过阈值报错。
解决方案
GaussDB(for MySQL) 提供了“rds_blob_sort_using_addon”参数来控制全字段排序。
该参数目前未在控制台开放,如有需要请联系客服进行处理。