Skip to content

Commit 7182df1

Browse files
authored
Add different stat histogram test cases (#4881)
1 parent b5a920d commit 7182df1

File tree

7 files changed

+539
-108
lines changed

7 files changed

+539
-108
lines changed

ydb/core/tablet_flat/benchmark/b_part.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ BENCHMARK_DEFINE_F(TPartFixture, DoCharge)(benchmark::State& state) {
216216
auto key1 = tool.KeyCells(Mass->Saved[row1]);
217217
auto key2 = tool.KeyCells(Mass->Saved[row2]);
218218
if (reverse) {
219-
ChargeRangeReverse(&Env, key1, key2, run, *Subset->Scheme->Keys, tags, items, 0);
219+
ChargeRangeReverse(&Env, key1, key2, run, *Subset->Scheme->Keys, tags, items, 0, true);
220220
} else {
221-
ChargeRange(&Env, key1, key2, run, *Subset->Scheme->Keys, tags, items, 0);
221+
ChargeRange(&Env, key1, key2, run, *Subset->Scheme->Keys, tags, items, 0, true);
222222
}
223223
}
224224
}

ydb/core/tablet_flat/flat_part_charge_range.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ namespace {
1111

1212
bool ChargeRange(IPages *env, const TCells key1, const TCells key2,
1313
const TRun &run, const TKeyCellDefaults &keyDefaults, TTagsRef tags,
14-
ui64 items, ui64 bytes, bool includeHistory = false) noexcept;
14+
ui64 items, ui64 bytes, bool includeHistory) noexcept;
1515

1616
bool ChargeRangeReverse(IPages *env, const TCells key1, const TCells key2,
1717
const TRun &run, const TKeyCellDefaults &keyDefaults, TTagsRef tags,
18-
ui64 items, ui64 bytes, bool includeHistory = false) noexcept;
18+
ui64 items, ui64 bytes, bool includeHistory) noexcept;
1919

2020
}

ydb/core/tablet_flat/flat_part_index_iter_bree_index.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ class TPartGroupBtreeIndexIter : public IPartGroupIndexIter {
274274
return State.back().BeginKey.Iter().At(index);
275275
}
276276

277+
void GetKeyCells(TSmallVec<TCell>& keyCells) const override {
278+
keyCells.clear();
279+
280+
Y_ABORT_UNLESS(IsLeaf());
281+
282+
auto iter = State.back().BeginKey.Iter();
283+
for (TPos pos : xrange(iter.Count())) {
284+
Y_UNUSED(pos);
285+
keyCells.push_back(iter.Next());
286+
}
287+
}
288+
277289
private:
278290
template<typename TSeek>
279291
EReady DoSeek(TSeek seek) {

ydb/core/tablet_flat/flat_part_index_iter_iface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace NKikimr::NTable {
2424

2525
virtual TPos GetKeyCellsCount() const = 0;
2626
virtual TCell GetKeyCell(TPos index) const = 0;
27+
virtual void GetKeyCells(TSmallVec<TCell>& keyCells) const = 0;
2728

2829
virtual ~IPartGroupIndexIter() = default;
2930
};

ydb/core/tablet_flat/flat_stat_table_mixed_index.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ inline bool BuildStatsMixedIndex(const TSubset& subset, TStats& stats, ui64 rowC
1414
TDataStats iteratorStats = { };
1515
TStatsIterator statsIterator(subset.Scheme->Keys);
1616

17+
// Note: B-Tree index uses resolution to skip huge nodes
18+
// doesn't work well with intersecting SSTs
19+
const ui32 resolutionDivider = 5;
20+
1721
// Make index iterators for all parts
1822
bool started = true;
1923
for (const auto& part : subset.Flatten) {
2024
stats.IndexSize.Add(part->IndexesRawSize, part->Label.Channel());
2125
TAutoPtr<TStatsScreenedPartIterator> iter = new TStatsScreenedPartIterator(part, env, subset.Scheme->Keys, part->Small, part->Large,
22-
rowCountResolution, dataSizeResolution);
26+
rowCountResolution / resolutionDivider, dataSizeResolution / resolutionDivider);
2327
auto ready = iter->Start();
2428
if (ready == EReady::Page) {
2529
started = false;

ydb/core/tablet_flat/test/libs/table/test_mixer.h

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <util/generic/utility.h>
34
#include <util/random/mersenne.h>
45

56
namespace NKikimr {
@@ -16,44 +17,46 @@ namespace NTest {
1617
};
1718

1819
struct TMixerRnd {
19-
TMixerRnd(ui32 num) : Num(num) { }
20+
TMixerRnd(ui32 buckets)
21+
: Buckets(buckets)
22+
{
23+
}
2024

2125
ui32 operator()(const TRow&) noexcept
2226
{
23-
return Random.Uniform(Num);
27+
return Random.Uniform(Buckets);
2428
}
2529

2630
private:
27-
const ui32 Num = 1;
31+
const ui32 Buckets = 1;
2832
TMersenne<ui64> Random;
2933
};
3034

3135
struct TMixerSeq {
32-
TMixerSeq(ui32 num, ui64 rows)
33-
: Num(num)
34-
, Base(rows / num)
35-
, Skip(rows % num)
36+
TMixerSeq(ui32 buckets, ui64 rows)
37+
: Buckets(buckets)
38+
, RowsPerBucket(rows / buckets)
39+
, Skip(rows % buckets)
3640
{
37-
3841
}
3942

4043
ui32 operator()(const TRow&) noexcept
4144
{
42-
if (Buck-- == 0) {
43-
ui64 one = (Skip && Skip > Random.Uniform(Num) ? 1 : 0);
45+
if (CurrentBucketRemainingRows-- == 0) { // start next bucket with CurrentBucketRemainingRows rows
46+
ui64 one = (Skip && Skip > Random.Uniform(Buckets) ? 1 : 0);
4447

45-
Buck = Base + one, Skip -= one, Hash++;
48+
CurrentBucketRemainingRows = RowsPerBucket + one, Skip -= one, CurrentBucket++;
4649
}
4750

48-
return Min(Hash, Num - 1);
51+
return Min(CurrentBucket, Buckets - 1);
4952
}
5053

5154
private:
52-
const ui32 Num = 1;
53-
ui64 Base = Max<ui64>();
54-
ui64 Skip = 0;
55-
ui64 Buck = 0;
56-
ui32 Hash = Max<ui32>();
55+
const ui32 Buckets;
56+
ui64 RowsPerBucket;
57+
ui64 Skip;
58+
ui64 CurrentBucketRemainingRows = 0;
59+
ui32 CurrentBucket = Max<ui32>();
5760
TMersenne<ui64> Random;
5861
};
5962
}

0 commit comments

Comments
 (0)