eorm icon indicating copy to clipboard operation
eorm copied to clipboard

WIP 分库分表---结果集处理 ditinct

Open juniaoshaonian opened this issue 1 year ago • 9 comments

我的思路是这样的:我们会将数据存在两个地方,treemap和heap中。treemap保存排序列相同的所有数据行做部分去重。整体流程是这样的,首先初始化先从sql.Rows取数据放入heap中。然后需要将最小的那个排序列的所有数据行拿出来放入treemap做去重。我们在next的时候去treemap中拿数据,如果treemap中的数据被拿光了,就再从heap中取值

juniaoshaonian avatar Jun 06 '23 16:06 juniaoshaonian

大佬们看看测试还需要补充nextandscan的测试还需要补充哪些

juniaoshaonian avatar Jun 06 '23 16:06 juniaoshaonian

我是认为,一个实现就能把这些全部情况解决掉的。比如说没有 Order By 和 Order By 里面的列不符合前缀原则,是等价的。

所有的一切都可以归结为:

  • 初始化的时候,根据 Order By 和 Distinct 列,读取第一批数据。那么没有 Order By 和 Order By 里面的列不符合前缀原则,就是全部取过来
  • 每次的时候,先看堆里面还有没有数据,没有的话就再次取一批数据,如果已经取完了,就说明没了。

所以一切的难点就在:我要有一个方法,根据 Order By和 Distinct 的列,来读取一批数据。至于这一批数据,是全部数据还是部分数据,就是看情况了。

flycash avatar Jun 07 '23 03:06 flycash

我举一个例子,假如说现在有一个 DISCTINCT A, B, C 的查询。

那么:

  1. 如果完全没有 Order By,那么就需要全量取出来在去重;
  2. 有 Order By, Order By A 这种情况,那么每次取数据就是取 A 为固定值的时候,对应的数据
  3. 有 Order By,Order By D, A 这种,不符合前缀原则,所以还是要全量取出来。Order By D, E, A 也是如此...
  4. 有 Order By,但是 Order By 完全不包含 ABC 中的任何一列,全量取
  5. 有 Order By,Order By A, D, B,那么只能使用前缀 A
  6. 有 Order By,Order By A B C D,那么只能使用 A,B,C,每次需要取一批数据

flycash avatar Jun 08 '23 06:06 flycash

我举一个例子,假如说现在有一个 DISCTINCT A, B, C 的查询。

那么:

  1. 如果完全没有 Order By,那么就需要全量取出来在去重;
  2. 有 Order By, Order By A 这种情况,那么每次取数据就是取 A 为固定值的时候,对应的数据
  3. 有 Order By,Order By D, A 这种,不符合前缀原则,所以还是要全量取出来。Order By D, E, A 也是如此...
  4. 有 Order By,但是 Order By 完全不包含 ABC 中的任何一列,全量取
  5. 有 Order By,Order By A, D, B,那么只能使用前缀 A
  6. 有 Order By,Order By A B C D,那么只能使用 A,B,C,每次需要取一批数据

使用distinct的时候好像就不会有其他列了,写distinct的时候只能写在distinct之后。表示多个列去重,又因为order by 的字段需要放到 select 列表中。所以我觉得没有什么前缀问题了。

juniaoshaonian avatar Jun 08 '23 13:06 juniaoshaonian

懂你的意思了,我应该是搞错了一个东西

flycash avatar Jun 08 '23 14:06 flycash

按照你的想法来

flycash avatar Jun 08 '23 14:06 flycash

你觉得有必要把没有orderby的情况加进来吗?

juniaoshaonian avatar Jun 09 '23 04:06 juniaoshaonian

Codecov Report

Merging #206 (2c9776b) into dev (d918cee) will decrease coverage by 1.09%. The diff coverage is 73.91%.

@@            Coverage Diff             @@
##              dev     #206      +/-   ##
==========================================
- Coverage   85.65%   84.56%   -1.09%     
==========================================
  Files          48       50       +2     
  Lines        3653     3907     +254     
==========================================
+ Hits         3129     3304     +175     
- Misses        415      482      +67     
- Partials      109      121      +12     
Impacted Files Coverage Δ
internal/merger/utils/compare.go 0.00% <0.00%> (ø)
internal/merger/sortmerger/merger.go 89.15% <80.95%> (-0.71%) :arrow_down:
internal/merger/sortmerger/distinctMerger.go 83.75% <83.75%> (ø)
internal/merger/sortmerger/heap.go 100.00% <100.00%> (+1.66%) :arrow_up:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more

codecov[bot] avatar Jun 11 '23 05:06 codecov[bot]

你觉得有必要把没有orderby的情况加进来吗?

之前没注意到,我是觉得可以一个算法解决掉的

flycash avatar Jun 11 '23 15:06 flycash

已在 #224 实现(借鉴了本PR的代码,已添加合作者), 故关闭此PR

longyue0521 avatar Jun 14 '24 14:06 longyue0521