如何用SQL查询 OceanBase 租户请求队列大小与SQL 在等待队列中等待耗时

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】OCP有 metrics 监控项,如何用SQL查询 OceanBase 租户请求队列大小与SQL 在等待队列中等待耗时,此SQL可以反应OB整体性能与是否存在排队阻塞现象

[@论坛小助手]

1 个赞

针对您的问题,我们可以使用 obdiag 来收集有关 SQL 在请求队列中的等待情况的信息,尤其是对于租户请求队列大小及 SQL 等待耗时的数据。这可以帮助我们判断是否存在排队阻塞的情况。

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

日志采集命令:

obdiag gather scene run --scene=observer.perf_sql --env "{db_connect='-h<主机IP> -P<端口号> -u<用户名>@<租户名> -p<密码> -D<数据库名>', trace_id='<追踪ID>'}"

在这个命令中,请替换 <主机IP><端口号><用户名><租户名><密码><数据库名> 为您的实际值。trace_id 可以通过查看具体的 SQL 请求获取,如果您不确定如何获得这个值,可以省略这个参数。

推荐的 SQL 查询:

如果您希望直接通过 SQL 查询租户请求队列的大小和 SQL 在等待队列中的耗时,可以考虑以下查询语句:

  1. 查询当前正在运行的 SQL 会话及其状态:

    SELECT * FROM gv$session WHERE tenant_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = '<租户名称>');
    

    此查询将显示所有当前租户的活动会话。

  2. 查询 SQL 的等待事件:

    SELECT * FROM gv$sql_audit WHERE tenant_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = '<租户名称>') AND sql_id = '<SQL_ID>';
    

    该查询可以帮助您了解特定 SQL 语句的执行情况,包括等待时间等。

  3. 查询租户请求队列的大小:

    SELECT * FROM oceanbase.__all_tenant_queue_stat WHERE tenant_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = '<租户名称>');
    

请根据实际情况替换 <租户名称><SQL_ID>

需要您提供的信息:

  1. 您是否已经尝试过上述 SQL 查询,如果有,查询结果是什么?
  2. 您遇到的具体问题是哪一类 SQL 操作出现了长时间等待?
  3. 您能否提供最近一次出现问题的时间范围,以便我们能够更准确地定位问题?

希望以上信息对您有所帮助,如果有任何进一步的问题或需要更详细的指导,请随时告诉我。

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

1 个赞

可以通过gv$ob_sql_audit这个表查看一下

1 个赞

我也想通过 SELECT /*+ read_consistency(weak) query_timeout(100000000) */ tenant_name, SQL_ID, query_sql AS query_sql FROM oceanbase.GV$OB_SQL_AUDIT WHERE time_to_usec(NOW(6)) - request_time < 10601000000 AND tenant_name=‘ocp_monitor’ AND QUERY_SQL IS NOT NULL; 反查, 不知道是哪个SQL

1 个赞

貌似为文档 https://www.oceanbase.com/docs/common-ocp-1000000004277289

1 个赞