大查询工作区内存不足

【使用环境】生产环境
【OB 或其他组件】observer
【使用版本】4.2.0_CE
【问题描述】查询中大量使用 union /sort/group by 时偶发报错 No memory or reach tenant memory limit,查资料得知工作区内存受 ob_sql_work_area_percentage(默认仅 5%)限制。请问生产环境一般设置多少比较合适?调大该参数会对租户整体内存和并发稳定性带来什么风险?另外这类大查询是否有比调参更优的改写 / 索引方案?

1 个赞

@论坛小助手

生产环境 ob_sql_work_area_percentage 设置建议与风险

根据您提供的信息,您在执行大量使用 union、sort 和 group by 的查询时遇到内存不足的问题。ob_sql_work_area_percentage 参数确实控制了租户用于 SQL 排序等阻塞性算子的内存百分比,默认值为 5%。

1. 生产环境中一般设置多少合适?

  • 调整建议:生产环境中,对于频繁进行复杂操作(如 sort, group by)的应用,可以将 ob_sql_work_area_percentage 调整至 10% 或更高。具体数值需要依据实际业务情况和租户内存配置来定。
  • 测试验证:调整前,请务必在测试环境中先行验证,观察是否解决了内存不足问题且没有引发其他性能或稳定性问题。

2. 调大该参数的风险

  • 对租户整体内存的影响:增加工作区内存占比会减少其他功能(例如缓存)可用的内存量,如果过度调高可能会导致其他方面出现性能瓶颈。
  • 并发稳定性影响:较大的 ob_sql_work_area_percentage 值虽然有助于处理单个复杂查询,但如果多个这样的查询同时运行,则可能导致整体并发能力下降,甚至造成某些请求因为内存竞争而失败。

3. 大查询优化方案

除了直接修改系统变量外,还应考虑以下几种可能更优的方法:

  • SQL 重写:检查并优化涉及大量数据操作的 SQL 语句,尽量减少不必要的排序、分组等操作。
  • 索引优化:确保相关表上有适当的索引支持查询中的 join、where 条件以及 order by 子句。
  • 分区策略:利用表分区技术减少每次查询所需处理的数据量。
  • 资源隔离:为大查询分配专用的资源池,避免其占用过多共享资源,影响其他任务执行效率。
  • 启用查询超时机制:通过设置合理的 large_query_threshold 来识别潜在的大查询,并限制其最大执行时间,防止长期占用过多资源。

示例代码 - 修改 ob_sql_work_area_percentage

如果您决定尝试调整此参数,可以通过如下命令进行更改:

-- 查看当前值
obclient> show global variables like 'ob_sql_work_area_percentage';

-- 更新为新值
obclient> set global ob_sql_work_area_percentage = 10;

-- 再次确认已生效
obclient> show global variables like 'ob_sql_work_area_percentage';

请记得所有变更都应在非高峰时段谨慎实施,并密切监控系统状态以评估效果及潜在影响。希望这些建议能帮助您解决遇到的问题!

检索到的文档如下:

  1. 内存相关问题
  2. ob_sql_work_area_percentage
  3. 租户内部内存管理
  4. 产品 FAQ
  5. ob_sql_audit_percentage
  6. 系统变量总览
  7. sql_audit_memory_limit
  8. SQL 性能问题的典型场景和排查思路