为什么查询不到数据的时候查询很慢?

【 使用环境 】 测试环境
【 OB or 其他组件 】 OB
【 使用版本 】4.3.5
【问题描述】构造2百万数据列存表(where条件的字段都建立了单独的索引,没有组合索引),这个查询需要30s+返回,而且返回的是空数据:
SELECT * FROM test.esbenchindex WHERE lastTime >= ‘2023-12-08T14:15:22’ AND lastTime < '2024-01-07T14:15:22
’ AND whiteState = ‘xxx’ AND direction IN (2) AND gptResult IN (130, 110, 140, 150) AND dealAction != ‘aaa’ limit 100;

后面发现当更换 gptResult IN (130, 110, 140, 150) 为 gptResult IN (9) 则会命中数据并1s左右返回数据。

再发现同样的数据如果更换成行表,同样存在相同的问题,但是耗时比列存表更少(返回空的数据耗时10s左右, 有数据则1s内)。

再发现同样的数据如果更换成行存列存冗余表,同样存在相同的问题,但是耗时比列存表更少(返回空的数据耗时几秒, 有数据则1s内)。

期望查不到数据应该更快才对,请问这种情况是否有优化手段?

@论坛小助手

1 个赞

推荐使用 obdiag 工具进行日志采集,这可以帮助我们诊断和解决查询性能问题。同时,我们将根据采集到的日志分析可能的原因并提供优化建议。

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

obdiag gather scene run --scene=observer.perf_sql --env "{db_connect='-h127.0.0.1 -P2881 -utest@test -p****** -Dtest', trace_id='Yxx'}"

请您按照上述命令进行日志采集,并将采集到的日志压缩包提供给我们,以便我们进一步分析问题。

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

  1. 您当前使用的 OceanBase 集群的具体配置,包括硬件配置和集群规模。
  2. test.esbenchindex 的表结构和索引定义。
  3. 查询语句的执行计划(可以使用 EXPLAIN 命令获取)。
  4. gptResult IN (9) 时查询速度快的情况下的执行计划。
  5. 是否有其他并发查询或事务影响了查询性能。
  6. 是否进行了表的统计信息收集,如果有,请提供最近一次收集的时间和方法。
  7. 是否有其他类似的查询语句也存在性能问题。

感谢您的配合!

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

1 个赞

66

1 个赞

麻烦使用obdiag采集一下sql的相关信息

建立联合索引就可以解决查询慢的问题:CREATE INDEX idx_combined_lasttime ON test.esbenchindex (whiteState, direction, gptResult, lastTime);

1 个赞