Skip to content

Commit 5fa4b2f

Browse files
authored
KIKIMR-19522 BTreeIndex Iter Remove single run optimization (#995)
1 parent 74fd99e commit 5fa4b2f

File tree

6 files changed

+609
-427
lines changed

6 files changed

+609
-427
lines changed

ydb/core/tablet_flat/benchmark/b_part_index.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ namespace {
7676
UNIT_ASSERT_GE(part->Stat.Bytes, 100ull*1024*1024);
7777
UNIT_ASSERT_LE(part->Stat.Bytes, 100ull*1024*1024 + 10ull*1024*1024);
7878

79+
UNIT_ASSERT_VALUES_EQUAL(part->Slices->size(), 1);
80+
7981
GroupId = TGroupId(groups ? 1 : 0);
8082
}
8183

@@ -192,18 +194,19 @@ BENCHMARK_DEFINE_F(TPartIndexSeekFixture, SeekKey)(benchmark::State& state) {
192194

193195
BENCHMARK_DEFINE_F(TPartIndexIteratorFixture, DoReads)(benchmark::State& state) {
194196
const bool reverse = state.range(3);
195-
const ui32 items = state.range(4);
197+
const ESeek seek = static_cast<ESeek>(state.range(4));
198+
const ui32 items = state.range(5);
196199

197200
for (auto _ : state) {
198201
auto it = Mass->Saved.Any(Rnd);
199202

200203
if (reverse) {
201-
CheckerReverse->Seek(*it, ESeek::Lower);
204+
CheckerReverse->Seek(*it, seek);
202205
for (ui32 i = 1; CheckerReverse->GetReady() == EReady::Data && i < items; i++) {
203206
CheckerReverse->Next();
204207
}
205208
} else {
206-
Checker->Seek(*it, ESeek::Lower);
209+
Checker->Seek(*it, seek);
207210
for (ui32 i = 1; Checker->GetReady() == EReady::Data && i < items; i++) {
208211
Checker->Next();
209212
}
@@ -242,6 +245,7 @@ BENCHMARK_REGISTER_F(TPartIndexIteratorFixture, DoReads)
242245
/* groups: */ {0, 1},
243246
/* history: */ {0, 1},
244247
/* reverse: */ {0, 1},
248+
/* ESeek: */ {1, 2, 3},
245249
/* items */ {1, 10, 100}})
246250
->Unit(benchmark::kMicrosecond);
247251

ydb/core/tablet_flat/flat_part_iter_multi.h

+28-48
Original file line numberDiff line numberDiff line change
@@ -297,12 +297,12 @@ namespace NTable {
297297
return EReady::Data;
298298
}
299299

300-
EReady SeekToStart() noexcept
300+
EReady SeekToSliceFirstRow() noexcept
301301
{
302302
return Seek(BeginRowId);
303303
}
304304

305-
EReady SeekToEnd() noexcept
305+
EReady SeekToSliceLastRow() noexcept
306306
{
307307
return Seek(EndRowId - 1);
308308
}
@@ -828,16 +828,16 @@ namespace NTable {
828828
return Main.Seek(rowId);
829829
}
830830

831-
EReady SeekToStart() noexcept
831+
EReady SeekToSliceFirstRow() noexcept
832832
{
833833
ClearKey();
834-
return Main.SeekToStart();
834+
return Main.SeekToSliceFirstRow();
835835
}
836836

837-
EReady SeekToEnd() noexcept
837+
EReady SeekToSliceLastRow() noexcept
838838
{
839839
ClearKey();
840-
return Main.SeekToEnd();
840+
return Main.SeekToSliceLastRow();
841841
}
842842

843843
EReady Next() noexcept
@@ -1387,18 +1387,7 @@ namespace NTable {
13871387

13881388
EReady Seek(const TCells key, ESeek seek) noexcept
13891389
{
1390-
if (Run.size() == 1) {
1391-
// Avoid overhead of extra key comparisons in a single slice
1392-
Current = Run.begin();
1393-
1394-
if (!CurrentIt) {
1395-
InitCurrent();
1396-
}
1397-
1398-
return CurrentIt->Seek(key, seek);
1399-
}
1400-
1401-
bool seekToStart = false;
1390+
bool seekToSliceFirstRow = false;
14021391
TRun::const_iterator pos;
14031392

14041393
switch (seek) {
@@ -1409,16 +1398,16 @@ namespace NTable {
14091398
case ESeek::Lower:
14101399
if (!key) {
14111400
pos = Run.begin();
1412-
seekToStart = true;
1401+
seekToSliceFirstRow = true;
14131402
break;
14141403
}
14151404

14161405
pos = Run.LowerBound(key);
14171406
if (pos != Run.end() &&
14181407
TSlice::CompareSearchKeyFirstKey(key, pos->Slice, *KeyCellDefaults) <= 0)
14191408
{
1420-
// Key is at the start of the slice
1421-
seekToStart = true;
1409+
// key <= FirstKey
1410+
seekToSliceFirstRow = true;
14221411
}
14231412
break;
14241413

@@ -1432,8 +1421,8 @@ namespace NTable {
14321421
if (pos != Run.end() &&
14331422
TSlice::CompareSearchKeyFirstKey(key, pos->Slice, *KeyCellDefaults) < 0)
14341423
{
1435-
// Key is at the start of the slice
1436-
seekToStart = true;
1424+
// key < FirstKey
1425+
seekToSliceFirstRow = true;
14371426
}
14381427
break;
14391428

@@ -1452,7 +1441,7 @@ namespace NTable {
14521441
UpdateCurrent();
14531442
}
14541443

1455-
if (!seekToStart) {
1444+
if (!seekToSliceFirstRow) {
14561445
auto ready = CurrentIt->Seek(key, seek);
14571446
if (ready != EReady::Gone) {
14581447
return ready;
@@ -1472,23 +1461,12 @@ namespace NTable {
14721461
UpdateCurrent();
14731462
}
14741463

1475-
return SeekToStart();
1464+
return SeekToSliceFirstRow();
14761465
}
14771466

14781467
EReady SeekReverse(const TCells key, ESeek seek) noexcept
14791468
{
1480-
if (Run.size() == 1) {
1481-
// Avoid overhead of extra key comparisons in a single slice
1482-
Current = Run.begin();
1483-
1484-
if (!CurrentIt) {
1485-
InitCurrent();
1486-
}
1487-
1488-
return CurrentIt->SeekReverse(key, seek);
1489-
}
1490-
1491-
bool seekToEnd = false;
1469+
bool seekToSliceLastRow = false;
14921470
TRun::const_iterator pos;
14931471

14941472
switch (seek) {
@@ -1498,7 +1476,7 @@ namespace NTable {
14981476

14991477
case ESeek::Lower:
15001478
if (!key) {
1501-
seekToEnd = true;
1479+
seekToSliceLastRow = true;
15021480
pos = Run.end();
15031481
--pos;
15041482
break;
@@ -1508,7 +1486,8 @@ namespace NTable {
15081486
if (pos != Run.end() &&
15091487
TSlice::CompareLastKeySearchKey(pos->Slice, key, *KeyCellDefaults) <= 0)
15101488
{
1511-
seekToEnd = true;
1489+
// LastKey <= key
1490+
seekToSliceLastRow = true;
15121491
}
15131492
break;
15141493

@@ -1522,7 +1501,8 @@ namespace NTable {
15221501
if (pos != Run.end() &&
15231502
TSlice::CompareLastKeySearchKey(pos->Slice, key, *KeyCellDefaults) < 0)
15241503
{
1525-
seekToEnd = true;
1504+
// LastKey < key
1505+
seekToSliceLastRow = true;
15261506
}
15271507
break;
15281508

@@ -1541,7 +1521,7 @@ namespace NTable {
15411521
UpdateCurrent();
15421522
}
15431523

1544-
if (!seekToEnd) {
1524+
if (!seekToSliceLastRow) {
15451525
auto ready = CurrentIt->SeekReverse(key, seek);
15461526
if (ready != EReady::Gone) {
15471527
return ready;
@@ -1563,7 +1543,7 @@ namespace NTable {
15631543
UpdateCurrent();
15641544
}
15651545

1566-
return SeekToEnd();
1546+
return SeekToSliceLastRow();
15671547
}
15681548

15691549
EReady Next() noexcept
@@ -1586,7 +1566,7 @@ namespace NTable {
15861566

15871567
UpdateCurrent();
15881568

1589-
ready = SeekToStart();
1569+
ready = SeekToSliceFirstRow();
15901570
if (ready == EReady::Page) {
15911571
// we haven't sought start, will do it again later
15921572
Current--;
@@ -1618,7 +1598,7 @@ namespace NTable {
16181598
--Current;
16191599
UpdateCurrent();
16201600

1621-
ready = SeekToEnd();
1601+
ready = SeekToSliceLastRow();
16221602
if (ready == EReady::Page) {
16231603
// we haven't sought end, will do it again later
16241604
Current++;
@@ -1747,17 +1727,17 @@ namespace NTable {
17471727
InitCurrent();
17481728
}
17491729

1750-
Y_FORCE_INLINE EReady SeekToStart() noexcept
1730+
Y_FORCE_INLINE EReady SeekToSliceFirstRow() noexcept
17511731
{
1752-
auto ready = CurrentIt->SeekToStart();
1732+
auto ready = CurrentIt->SeekToSliceFirstRow();
17531733
Y_ABORT_UNLESS(ready != EReady::Gone,
17541734
"Unexpected slice without the first row");
17551735
return ready;
17561736
}
17571737

1758-
Y_FORCE_INLINE EReady SeekToEnd() noexcept
1738+
Y_FORCE_INLINE EReady SeekToSliceLastRow() noexcept
17591739
{
1760-
auto ready = CurrentIt->SeekToEnd();
1740+
auto ready = CurrentIt->SeekToSliceLastRow();
17611741
Y_ABORT_UNLESS(ready != EReady::Gone,
17621742
"Unexpected slice without the last row");
17631743
return ready;

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,15 @@ namespace NTest {
176176
return index.GetLastRecord();
177177
}
178178

179-
inline const TPartIndexIt::TRecord * GetRecord(const TPartStore& part, TPageId pageId) {
179+
inline const TPartIndexIt::TRecord * GetRecord(const TPartStore& part, TPageId pageIndex) {
180180
TTestEnv env;
181181
TPartIndexIt index(&part, &env, { });
182182

183183
Y_ABORT_UNLESS(index.Seek(0) == EReady::Data);
184-
for (TPageId p = 0; p < pageId; p++) {
184+
for (TPageId p = 0; p < pageIndex; p++) {
185185
Y_ABORT_UNLESS(index.Next() == EReady::Data);
186186
}
187187

188-
Y_ABORT_UNLESS(index.GetPageId() == pageId);
189188
return index.GetRecord();
190189
}
191190
}

0 commit comments

Comments
 (0)