summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstanly <[email protected]>2023-05-12 18:42:11 +0300
committerstanly <[email protected]>2023-05-12 18:42:11 +0300
commit56bc42869149ed7e52e604cb38660e80dc1269f9 (patch)
tree1b29fa6f89fdd5fa0e149d30f9ebe75339459051
parent7d3342c4ec4453b9c70ecf4396e5ff06171434c5 (diff)
reduce number of hash lookups
-rw-r--r--ydb/core/tx/columnshard/engines/column_engine_logs.cpp26
-rw-r--r--ydb/core/tx/columnshard/engines/column_engine_logs.h1
2 files changed, 10 insertions, 17 deletions
diff --git a/ydb/core/tx/columnshard/engines/column_engine_logs.cpp b/ydb/core/tx/columnshard/engines/column_engine_logs.cpp
index 885af522025..da9b4acc649 100644
--- a/ydb/core/tx/columnshard/engines/column_engine_logs.cpp
+++ b/ydb/core/tx/columnshard/engines/column_engine_logs.cpp
@@ -1181,13 +1181,9 @@ bool TColumnEngineForLogs::CanInsert(const TChanges& changes, const TSnapshot& c
return true;
}
-TMap<TSnapshot, std::vector<ui64>> TColumnEngineForLogs::GetOrderedPortions(ui64 granule, const TSnapshot& snapshot) const {
- Y_VERIFY(Granules.contains(granule));
- auto& spg = Granules.find(granule)->second;
- Y_VERIFY(spg);
-
- TMap<TSnapshot, std::vector<ui64>> out;
- for (const auto& [portion, portionInfo] : spg->Portions) {
+static TMap<TSnapshot, std::vector<const TPortionInfo*>> GroupPortionsBySnapshot(const THashMap<ui64, TPortionInfo>& portions, const TSnapshot& snapshot) {
+ TMap<TSnapshot, std::vector<const TPortionInfo*>> out;
+ for (const auto& [portion, portionInfo] : portions) {
if (portionInfo.Empty()) {
continue;
}
@@ -1201,7 +1197,7 @@ TMap<TSnapshot, std::vector<ui64>> TColumnEngineForLogs::GetOrderedPortions(ui64
}
if (visible) {
- out[recSnapshot].push_back(portion);
+ out[recSnapshot].push_back(&portionInfo);
}
}
return out;
@@ -1249,16 +1245,14 @@ std::shared_ptr<TSelectInfo> TColumnEngineForLogs::Select(ui64 pathId, TSnapshot
auto& portions = spg->Portions;
bool granuleHasDataForSnaphsot = false;
- TMap<TSnapshot, std::vector<ui64>> orderedPortions = GetOrderedPortions(granule, snapshot);
+ TMap<TSnapshot, std::vector<const TPortionInfo*>> orderedPortions = GroupPortionsBySnapshot(portions, snapshot);
for (auto& [snap, vec] : orderedPortions) {
- for (auto& portion : vec) {
- auto& portionInfo = portions.find(portion)->second;
-
+ for (const auto* portionInfo : vec) {
TPortionInfo outPortion;
- outPortion.Meta = portionInfo.Meta;
+ outPortion.Meta = portionInfo->Meta;
outPortion.Records.reserve(columnIds.size());
- for (auto& rec : portionInfo.Records) {
+ for (auto& rec : portionInfo->Records) {
Y_VERIFY(rec.Valid());
if (columnIds.contains(rec.ColumnId)) {
outPortion.Records.push_back(rec);
@@ -1266,10 +1260,10 @@ std::shared_ptr<TSelectInfo> TColumnEngineForLogs::Select(ui64 pathId, TSnapshot
}
Y_VERIFY(outPortion.Produced());
if (!pkRangesFilter.IsPortionInUsage(outPortion, GetIndexInfo())) {
- AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_SCAN)("event", "portion_skipped")("granule", granule)("portion", portion);
+ AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_SCAN)("event", "portion_skipped")("granule", granule)("portion", portionInfo->Portion());
continue;
} else {
- AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_SCAN)("event", "portion_selected")("granule", granule)("portion", portion);
+ AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_SCAN)("event", "portion_selected")("granule", granule)("portion", portionInfo->Portion());
}
out->Portions.emplace_back(std::move(outPortion));
granuleHasDataForSnaphsot = true;
diff --git a/ydb/core/tx/columnshard/engines/column_engine_logs.h b/ydb/core/tx/columnshard/engines/column_engine_logs.h
index d4f26822848..82b8353c79e 100644
--- a/ydb/core/tx/columnshard/engines/column_engine_logs.h
+++ b/ydb/core/tx/columnshard/engines/column_engine_logs.h
@@ -320,7 +320,6 @@ private:
EStatsUpdateType updateType) const;
bool CanInsert(const TChanges& changes, const TSnapshot& commitSnap) const;
- TMap<TSnapshot, std::vector<ui64>> GetOrderedPortions(ui64 granule, const TSnapshot& snapshot = TSnapshot::Max()) const;
void UpdateOverloaded(const THashMap<ui64, std::shared_ptr<TGranuleMeta>>& granules);
/// Return lists of adjacent empty granules for the path.