tidb升级后使用hint仍然走不到正确的执行计划

【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】7.5.6
【操作系统】
【部署方式】云上部署(什么云)/机器部署(什么机器配置、什么硬盘)
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
tidb从5.4.0升级到7.5.6后,SQL执行计划发生改变,尝试使用hint,SQL仍然选择全表扫描,无法走到正确执行计划

explain UPDATE /*+ USE_INDEX(t_skin, uidx_FAccountId_FSkinId_FIsDeleted) */ t_skin
SET FTotalFragmentCount =
CASE

        WHEN (FAccountId = 123 AND FSkinId = 10053) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10054) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10010) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10012) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10017) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10020) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10024) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10025) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10028) THEN 20
       
        WHEN (FAccountId = 123 AND FSkinId = 10007) THEN 202
     
    ELSE FTotalFragmentCount
    END,
    `FCurrentFragmentCount` =
    CASE
      
        WHEN (FAccountId = 123 AND FSkinId = 10053) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10054) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10010) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10012) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10017) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10020) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10024) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10025) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10028) THEN 0
       
        WHEN (FAccountId = 123 AND FSkinId = 10007) THEN 182
     
    ELSE FCurrentFragmentCount
    END
    WHERE
    (FAccountId,FSkinId) IN
     (  
        (123,10053)
     , 
        (123,10054)
     , 
        (123,10010)
     , 
        (123,10012)
     , 
        (123,10017)
     , 
        (123,10020)
     , 
        (123,10024)
     , 
        (123,10025)
     , 
        (123,10028)
     , 
        (123,10007)
     )

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

explain执行完sql后,执行下show warnings看下

1 个赞

没有warning

FAccountId,FSkinId这两个列上是联合索引把?

索引没问题,就是走不到正确索引

mysql 客户端吗,登陆的时候加 -c 了吗

1 个赞

这个索引能这么走吗??没见过这个用法

TiDB v6.2.0 引入了新的代价模型 Cost Model Version 2。
Cost Model Version 2 对代价公式进行了更精确的回归校准,调整了部分代价公式,比此前版本的代价公式更加准确。
你可以通过设置变量 tidb_cost_model_version 来控制代价模型的版本。

升级的版本正好符合这个调整,可以尝试修改下代价模型。

我们改写了SQL解决了问题,看起来似乎是tidb bug,无论如何都走不到正确索引

刚开始没加-c,后面加了试了也没用

提供 plan replay 信息,参考:https://docs.pingcap.com/zh/tidb/v7.5/sql-plan-replayer/#使用-plan-replayer-保存和恢复集群现场信息

感觉还是多列组合在一起统计信息不准确,,,如可以测试,顺序改为FSkinId,FAccountId, 然后(FSkinId,FAccountId) IN 这样测试一下

可以贴下改写后的sql吗?或者说下改写的思路?