ecodeclub / eorm

简单 ORM 框架
Apache License 2.0
191 stars 64 forks source link

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

Closed juniaoshaonian closed 2 months ago

juniaoshaonian commented 1 year ago

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

juniaoshaonian commented 1 year ago

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

flycash commented 1 year ago

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

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

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

flycash commented 1 year ago

我举一个例子,假如说现在有一个 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,每次需要取一批数据
juniaoshaonian commented 1 year ago

我举一个例子,假如说现在有一个 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 列表中。所以我觉得没有什么前缀问题了。

flycash commented 1 year ago

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

flycash commented 1 year ago

按照你的想法来

juniaoshaonian commented 1 year ago

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

codecov[bot] commented 1 year ago

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

flycash commented 1 year ago

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

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

longyue0521 commented 2 months ago

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