SUBPLAN FILTER子查询执行慢,如何优化?

【 使用环境 】生产环境
【 OB or 其他组件 】
【 使用版本 】4.3.2
【问题描述】SQL是 select a.* from a where a.pk_id in 非相关子查询,a表800w数据,执行耗时8s,而mysql只需要1s。看下了执行计划里有SUBPLAN FILTER,对a表循环每行,去查询子查询,效果很差。子查询实际结果只有几十行,因此最好是先执行子查询,获得pk_id集合,再根据主键pk_id快速获取数据,请问该怎么优化保证非相关子查询先执行。 @论坛小助手
【复现路径】问题出现前后相关操作
【附件及日志】无
image

针对您提到的使用 SUBPLAN FILTER 执行非相关子查询导致 SQL 执行慢的问题,我们可以先通过 obdiag 工具收集 SQL 的执行计划和性能相关信息,以便进一步分析问题的原因。同时,根据您的描述,可能需要检查 SQL 语句的编写方式,确保子查询能够优先执行,或者考虑使用并行执行来提高查询效率。

日志采集场景: SQL性能问题

日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

请使用上述命令采集 SQL 性能相关的日志,并将采集到的日志提供给我们。这将帮助我们了解 SQL 执行的具体情况,包括执行计划、资源使用情况等。

为了更好地帮助您解决问题,请您提供以下信息:

  1. 您当前使用的 SQL 语句是什么?特别是包含 SUBPLAN FILTER 的部分。
  2. 您是否已经尝试过使用并行执行来优化查询?如果是,请提供并行执行的相关配置。
  3. 您的数据表结构和索引情况是怎样的?特别是涉及到子查询的表。
  4. 您是否有其他相关的 SQL 调优经验或尝试过的方法?
  5. 您的 OceanBase 集群配置情况如何?包括硬件配置和系统参数设置。

这些信息将有助于我们更准确地分析问题并提供优化建议。感谢您的配合!

具体信息可参考以下文档:

  1. SUBPLAN FILTER
  2. 并行开启方式及优先级
  3. DBMS_XPLAN 概述
  4. SQL 调优典型场景和案例

附上敏捷诊断工具 obdiag 使用帮助链接

1、EXPLAIN EXTENDED发一下执行计划 尽量保存在文本里
2、 使用obdiag 根据小助手提示 使用obdiag工具
收集SQL性能问题信息

obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”