Tispark查询时,task number 是根据region number分的吧,为何范围查询和in查询task数量不同

tispark直接通过pd查询tikv,有索引的情况下整体流程是什么

2 个赞

可以先了解一下 TiSpark使用指南:https://pingcap.com/docs-cn/v3.0/reference/tispark/#tispark-用户指南

官方文档早已看过了,项目中也用到了,现在遇到的问题是where条件中用到了索引字段a。如果是a>=1 and a<150查询有14个task;如果是a in (1,2,3,4…149)的查询,有58个task

@wodeqiangne

tispark直接通过pd查询tikv,有索引的情况下整体流程是什么

这种情况下,TiSpark 会根据从 tikv 中获取的统计信息,做出成本最小的 plan。即使有 index, 并不意味着某一个查询一定走 index scan。相反地,如果 table scan 成本更小,TiSpark 会走 table scan。

task number 根据 region number

能否请你再详细说一下问题呢。 如果你说的是 region task,这个取决于数据分布的。 TiSpark 通过 where 条件获取此次查询的 key range,进而将这些 key range 按照 region (region 也是有 range 的) 的维度来进行拆分形成不同的 task。 另外在某些情况,task 也会在 RDD 执行是再次拆分,比如某个 region 发生分裂的时候。

希望以上答案有所帮助。

1 个赞


不太明白,您回复的截图是什么意思。 可否详细描述下?

primary_partition字段应范围查询有3个task,用in有58个task。。。。。。:cold_sweat:

能否给出对应的查询计划?

可以执行 spark.sql(“explain select xxxx”).show() 获取。

我初步怀疑是,where 下推了 但是 in 没有下推。 导致前者只需要获取部分数据,而后者需要扫全表。

1 个赞

确实如此,in子句并没有走primary_partition索引

如果别人的回答有帮助,可以将其标记为解决方案✅,这样可以帮助其他有同样问题的人快速找到答案~

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