diff options
author | maksim-kita <maksim-kita@yandex-team.com> | 2023-11-01 20:31:32 +0300 |
---|---|---|
committer | maksim-kita <maksim-kita@yandex-team.com> | 2023-11-01 20:47:33 +0300 |
commit | e464f98c31ce1f93e5588e6bbc7c0e2c15cafb7e (patch) | |
tree | 8f66802f5a11ea940c07df5585aa3cbbe0adef6a | |
parent | bf9ca672c8b62a183d118d591d3415e4276d5421 (diff) | |
download | ydb-e464f98c31ce1f93e5588e6bbc7c0e2c15cafb7e.tar.gz |
DataShard stats iterator avoid allocations
-rw-r--r-- | ydb/core/scheme/scheme_tablecell.cpp | 31 | ||||
-rw-r--r-- | ydb/core/scheme/scheme_tablecell.h | 16 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_stat_table.h | 8 | ||||
-rw-r--r-- | ydb/core/tx/datashard/datashard__read_iterator.cpp | 42 |
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( |