为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【TiDB 版本】4.0.12
为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【TiDB 版本】4.0.12
麻烦反馈下,建表语句和 explain analyze sql 的执行计划,多谢。(执行计划太长,可以上传到文件中,多谢。)
SQL.txt (76.5 KB)
sql1.txt (6.5 KB)
sql1.txt为 和另一张非分区表的关联查询,各表数据量
TF_F_USER_DISCNT:1449358763 TF_B_TRADE:1938136 ,TF_F_USER: 约140800000每分区440万
使用 hint 时,是在 mysql 客户端验证的还是程序反馈不好用,如果是客户端验证的,记得在客户端命令加上 --comments 参数,官网有类似提醒,可以看看
把tf_f_user重建为非分区表后,执行计划正常很快出结果
a表取出1条数据,然后取和b表的主键字段关联**(主键是单列bigint,PRIMARY KEY (USER_ID
))**,就算是没有分区裁剪,就1条数据也不至于执行1分多钟吧,而且改为非分区表后就正常了 , RPC是请求总和那么这些请求是消耗在什么地方,根据rowid去匹配数据一个分区需要多少请求?
另外表要么全表扫描要么通过索引定位,对于TableRangscan是具体怎样执行的?
不能使用index join 原因应该是分区表不支持内表为分区表?
问一下分区健是哪个字段啊
PARTITION BY HASH( user_id
)
PARTITIONS 32 |
我觉得这个问题不是分区裁剪的事,而是每个分区都扫描都要消耗比较长时间,tablerange scan不可能扫描整个分区吧
没太理解你的意思,不过我理解:由于在生成执行计划前,不知道 user-id 的具体范围,所以无法判断可以裁剪哪些分区,只能扫描全部分区,导致成本估算很大,所以采用了 hash join。同时你引出了另一个问题:为什么使用 hint 还没有选择使用 NL 的关联方式,这个我建议你 带上 --comments 的同时,把 hint 改成 ```
/*+ INL_JOIN(a, b) */ 试试
trade表根据过滤条件只有1数据(评估为3条),然后根据获得的user_id和 user表的user_id去匹配,由于是执行中获得的值所以不能进行分区裁剪,对user表每个分区进行扫描,使用tableranscane,执行计划中评估user表返回行数每个分区都400多万万,这个行数时如何评估的?根据trade表的trade_id评估返回的行数时3条,然后去和user表的主键列关联,怎么也不应该是每个分区评估出来400万条。。user是分区表时每个分区的tablerange scan的范围是range:[0,+inf],而非分区表时范围是range:decide by[d_order.tf_b_trade.user_id]
分区表在旧版本里面不能走 index lookup join 是已知问题
master 版本中开始支持了
应该 5.1 是开始 (实验性质 or 正式?) 支持分区表走 index lookup join
@h5n1
5.1 已经支持了,可以设置 tidb_partition_prune_mode 为 dymanic 测试下性能
https://docs.pingcap.com/zh/tidb/v5.1/system-variables#tidb_partition_prune_mode-从-v51-版本开始引入
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。