aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaksim-kita <maksim-kita@yandex-team.com>2023-11-01 20:31:32 +0300
committermaksim-kita <maksim-kita@yandex-team.com>2023-11-01 20:47:33 +0300
commite464f98c31ce1f93e5588e6bbc7c0e2c15cafb7e (patch)
tree8f66802f5a11ea940c07df5585aa3cbbe0adef6a
parentbf9ca672c8b62a183d118d591d3415e4276d5421 (diff)
downloadydb-e464f98c31ce1f93e5588e6bbc7c0e2c15cafb7e.tar.gz
DataShard stats iterator avoid allocations
-rw-r--r--ydb/core/scheme/scheme_tablecell.cpp31
-rw-r--r--ydb/core/scheme/scheme_tablecell.h16
-rw-r--r--ydb/core/tablet_flat/flat_stat_table.h8
-rw-r--r--ydb/core/tx/datashard/datashard__read_iterator.cpp42
4 files changed, 53 insertions, 44 deletions
diff --git a/ydb/core/scheme/scheme_tablecell.cpp b/ydb/core/scheme/scheme_tablecell.cpp
index 04f168be3a..e25ee1ad64 100644
--- a/ydb/core/scheme/scheme_tablecell.cpp
+++ b/ydb/core/scheme/scheme_tablecell.cpp
@@ -198,6 +198,37 @@ bool TSerializedCellVec::DoTryParse(const TString& data) {
return TryDeserializeCellVec(data, Buf, Cells);
}
+void TCellsStorage::Reset(TArrayRef<const TCell> cells)
+{
+ size_t cellsSize = cells.size();
+ size_t cellsDataSize = sizeof(TCell) * cellsSize;
+
+ for (size_t i = 0; i < cellsSize; ++i) {
+ const auto & cell = cells[i];
+ if (!cell.IsNull() && !cell.IsInline() && cell.Size() != 0) {
+ cellsDataSize += AlignUp(static_cast<size_t>(cell.Size()));
+ }
+ }
+
+ CellsData.resize(cellsDataSize);
+
+ char *cellsData = CellsData.data();
+ Cells = TArrayRef<TCell>{reinterpret_cast<TCell *>(cellsData), cellsSize};
+ cellsData += sizeof(TCell) * cellsSize;
+
+ for (size_t i = 0; i < cellsSize; ++i) {
+ const auto & cell = cells[i];
+
+ if (!cell.IsNull() && !cell.IsInline() && cell.Size() != 0) {
+ memcpy(cellsData, cell.Data(), cell.Size());
+ Cells[i] = TCell(cellsData, cell.Size());
+ cellsData += AlignUp(static_cast<size_t>(cell.Size()));
+ } else {
+ Cells[i] = cell;
+ }
+ }
+}
+
TOwnedCellVecBatch::TOwnedCellVecBatch()
: Pool(std::make_unique<TMemoryPool>(InitialPoolSize)) {
}
diff --git a/ydb/core/scheme/scheme_tablecell.h b/ydb/core/scheme/scheme_tablecell.h
index 7253f0a777..dd9126fd0d 100644
--- a/ydb/core/scheme/scheme_tablecell.h
+++ b/ydb/core/scheme/scheme_tablecell.h
@@ -551,6 +551,22 @@ private:
TVector<TCell> Cells;
};
+class TCellsStorage
+{
+public:
+ TCellsStorage() = default;
+
+ inline TConstArrayRef<TCell> GetCells() const {
+ return Cells;
+ }
+
+ void Reset(TArrayRef<const TCell> cells);
+
+private:
+ TArrayRef<TCell> Cells;
+ std::vector<char> CellsData;
+};
+
class TOwnedCellVecBatch {
public:
TOwnedCellVecBatch();
diff --git a/ydb/core/tablet_flat/flat_stat_table.h b/ydb/core/tablet_flat/flat_stat_table.h
index 52c5b476fd..98658d720b 100644
--- a/ydb/core/tablet_flat/flat_stat_table.h
+++ b/ydb/core/tablet_flat/flat_stat_table.h
@@ -7,6 +7,8 @@
#include <util/generic/queue.h>
#include <util/generic/hash_set.h>
+#include <ydb/core/scheme/scheme_tablecell.h>
+
namespace NKikimr {
namespace NTable {
@@ -29,13 +31,15 @@ public:
ui64 lastRowCount = stats.RowCount;
ui64 lastDataSize = stats.DataSize.Size;
+ TCellsStorage cellsStorage;
+
while (!Heap.empty()) {
TScreenedPartIndexIterator* it = Heap.top();
Heap.pop();
// makes key copy
- TSerializedCellVec serialized = TSerializedCellVec(TSerializedCellVec::Serialize({it->GetCurrentKey().Columns, it->GetCurrentKey().ColumnCount}));
- TDbTupleRef key(KeyColumns->BasicTypes().data(), serialized.GetCells().data(), serialized.GetCells().size());
+ cellsStorage.Reset({it->GetCurrentKey().Columns, it->GetCurrentKey().ColumnCount});
+ TDbTupleRef key(KeyColumns->BasicTypes().data(), cellsStorage.GetCells().data(), cellsStorage.GetCells().size());
auto ready = it->Next(stats);
if (ready == EReady::Page) {
diff --git a/ydb/core/tx/datashard/datashard__read_iterator.cpp b/ydb/core/tx/datashard/datashard__read_iterator.cpp
index 67017d540d..9deccda5da 100644
--- a/ydb/core/tx/datashard/datashard__read_iterator.cpp
+++ b/ydb/core/tx/datashard/datashard__read_iterator.cpp
@@ -46,48 +46,6 @@ private:
}
};
-class TCellsStorage
-{
-public:
- TCellsStorage() = default;
-
- void Reset(TArrayRef<const TCell> cells)
- {
- size_t CellsSize = cells.size();
- Cells.resize(CellsSize);
-
- size_t cellsDataSize = 0;
- for (size_t i = 0; i < CellsSize; ++i) {
- auto cell = cells[i];
- Cells[i] = cell;
-
- if (!cell.IsNull() && !cell.IsInline() && cell.Size() != 0) {
- cellsDataSize += cell.Size();
- }
- }
-
- CellsData.resize(cellsDataSize);
- char *cellsData = CellsData.data();
-
- for (size_t i = 0; i < CellsSize; ++i) {
- auto cell = Cells[i];
-
- if (!cell.IsNull() && !cell.IsInline() && cell.Size() != 0) {
- memcpy(cellsData, cell.Data(), cell.Size());
- Cells[i] = TCell(cellsData, cell.Size());
- cellsData += cell.Size();
- }
- }
- }
-
- TArrayRef<const TCell> GetCells() const {
- return Cells;
- }
-private:
- TSmallVec<TCell> Cells;
- std::vector<char> CellsData;
-};
-
class TCellBlockBuilder : public IBlockBuilder {
public:
bool Start(