简单discnt/group by 下推

【TiDB 版本】 5.0.2
简单的group /ditinct 不能下推到tikv层,然后在tidb层在去重或聚合吗?

  1. 可以先 analyze table 再 explain analyze 看看结果。
  2. 可以尝试加上 /*+ AGG_TO_COP() */ 先强制下推到 COP
    https://docs.pingcap.com/zh/tidb/v5.0/optimizer-hints#agg_to_cop

最后一个 group by BRAND, BRAND_CODE 连 agg 都没有,请问一下 BRAND, BRAND_CODE 是 UK 嘛?

CREATE TABLE td_s_brand (
BRAND_CODE char(4) NOT NULL,
BRAND varchar(20) DEFAULT NULL,
START_DATE datetime DEFAULT NULL,
END_DATE datetime DEFAULT NULL,
UPDATE_STAFF_ID varchar(20) DEFAULT NULL,
UPDATE_DEPART_ID varchar(10) DEFAULT NULL,
UPDATE_TIME datetime DEFAULT NULL,
PRIMARY KEY (BRAND_CODE) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |

那应该符合预期,BRAND_CODE 是主键肯定是唯一的 , 加上其他列的聚合也是唯一的。

select brand, brand_code, count(*)
from td_s_brand
group by brand, brand_code;

因为 brand_codetd_s_brand 的唯一索引,所以 (brand, brand_code) 组合起来也是唯一的,所以你看到的执行计划中聚合操作被消除了,因为每个 group 中只有 1 行记录,所以 count(*) 的结果是 1,最终没有任何聚合出现,这是优化器的一个启发式规则。

select distinct brand
from td_s_brand

因为 brand 的重复值并不多,去重前有 628 条数据,去重后有 577 条数据,所以优化器默认没有选择把这个聚合下推到 TiKV Coprocessor。注意到加了 APP_TO_COP() 这个 hint 后,执行时间是 19ms,不加这个 hint 聚合没有下推到 TiKV Coprocessor 的时候执行时间是 1.89ms,也说明了不下推比下推执行时间更短。

感谢各位

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