count(distinct)语句执行慢

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 表按月分区,该表开了tiflash 3副本,查询某一个月的数据,语句包含count(distinct),查询很慢,不知道是否可优化。

【现象】 加了distinct后耗时40s+,加了下推参数 tidb_opt_distinct_agg_push_down后也要20s+,只count就528ms

【问题】 执行很慢,是否可优化

【统计信息是否最新】

    【执行计划内容】
Projection_9 6.35 root log_dw.dwd_resource.resource_type, Column#24
└─TopN_12 6.35 root Column#24:desc, offset:0, count:50
└─HashAgg_26 6.35 root group by:log_dw.dwd_resource.resource_type, funcs:count(distinct log_dw.dwd_resource.event_id)->Column#24, funcs:firstrow(log_dw.dwd_resource.resource_type)->log_dw.dwd_resource.resource_type
└─TableReader_27 6.35 root data:HashAgg_17
└─HashAgg_17 6.35 batchCop[tiflash] group by:log_dw.dwd_resource.event_id, log_dw.dwd_resource.resource_type,
└─Selection_25 25162012.35 batchCop[tiflash] ge(log_dw.dwd_resource.event_time, 2021-06-01), in(log_dw.dwd_resource.operate_type, 2, 17), lt(log_dw.dwd_resource.event_time, 2021-07-01)
└─TableFullScan_24 162104310.00 batchCop[tiflash] table:dwd_resource, partition:p202106 keep order:false
    【 SQL 文本、schema 以及 数据分布】

SELECT resource_type AS resource_type,
count(DISTINCT event_id) AS count(DISTINCT event_id)
FROM dwd_resource
WHERE event_time >= STR_TO_DATE(‘2021-06-01’, ‘%Y-%m-%d’)
AND event_time < STR_TO_DATE(‘2021-07-01’, ‘%Y-%m-%d’)
AND operate_type IN (2,17)
GROUP BY resource_type
ORDER BY count(DISTINCT event_id) DESC
LIMIT 50;
【业务影响】
查询过慢
【TiDB 版本】 TiDB版本: 5.1.0

【附件】 相关日志及监控(https://metricstool.pingcap.com/)

  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview Grafana监控
  • TiDB Grafana 监控
  • TiKV Grafana 监控
  • PD Grafana 监控
  • 对应模块日志(包含问题前后 1 小时日志)

你这里其实2个问题:
1、可以创建个索引resource_type、event_id、STR_TO_DATE ,这个SQL 应该走 tikv 而不是 tiflash
2、distinct 下推的哪个参数,应该是针对 tikv 的,我这边需要确认一下,是否能下推到 tiflash

但是看这个执行计划确实是走的tiflash。

你们文档中说是tiflash…

这个确认了一下,确实 v5 支持了,看执行计划,好像转换成 group 了,我确认一下哈(如果确实下推了,并转换成了 group,估计只能创建索引了)

set tidb_enforce_mpp=1; 咱们是 5.1 了,可以试一下这个参数

1 个赞

为什么应该走kv呢?从数据量上看有1.6亿的量,而且是count操作,走tiflash不是更好吗?

请教,若是tp与ap共存的系统,调大tidb_distsql_scan_concurrency,以及其他参数,应该对tp类的操作也有影响吧?

没有理解到上面为什么转换成group操作是不好吗?因为有group的行为,您的意思是新建索引就不走group了吗?

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。