From 5bee300bd1644664dce525195970d2f12a5398e3 Mon Sep 17 00:00:00 2001 From: Evgeniy Ivanov Date: Wed, 18 Jun 2025 10:48:56 +0200 Subject: [PATCH 1/2] Speedup bulkupsert --- ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp | 4 ++-- ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp index 04fa0286ce92..292a72e3f4af 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp @@ -937,8 +937,8 @@ void TTableClient::TImpl::SetStatCollector(const NSdkStats::TStatCollector::TCli TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings) { auto request = MakeOperationRequest(settings); request.set_table(table); - *request.mutable_rows()->mutable_type() = TProtoAccessor::GetProto(rows.GetType()); - *request.mutable_rows()->mutable_value() = rows.GetProto(); + request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); + request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); auto promise = NewPromise(); diff --git a/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp b/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp index 64fa171dd0a3..61f3572fa60d 100644 --- a/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp +++ b/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp @@ -992,8 +992,8 @@ void TTableClient::TImpl::SetStatCollector(const NSdkStats::TStatCollector::TCli TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings) { auto request = MakeOperationRequest(settings); request.set_table(TStringType{table}); - *request.mutable_rows()->mutable_type() = TProtoAccessor::GetProto(rows.GetType()); - *request.mutable_rows()->mutable_value() = rows.GetProto(); + request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); + request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); auto promise = NewPromise(); From 432b1802d0ed71194bdb7a5983693a178f0aa79b Mon Sep 17 00:00:00 2001 From: Evgeniy Ivanov Date: Wed, 18 Jun 2025 12:04:20 +0200 Subject: [PATCH 2/2] Don't break shared TValue's impl case --- .../sdk/cpp/client/ydb_table/impl/table_client.cpp | 11 ++++++++--- .../sdk/cpp/client/ydb_table/impl/table_client.h | 2 +- ydb/public/sdk/cpp/client/ydb_table/table.cpp | 2 +- .../sdk/cpp/include/ydb-cpp-sdk/client/value/value.h | 7 +++++++ .../sdk/cpp/src/client/table/impl/table_client.cpp | 11 ++++++++--- .../sdk/cpp/src/client/table/impl/table_client.h | 2 +- ydb/public/sdk/cpp/src/client/table/table.cpp | 2 +- 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp index 292a72e3f4af..188ee88a821d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp @@ -934,11 +934,16 @@ void TTableClient::TImpl::SetStatCollector(const NSdkStats::TStatCollector::TCli RequestMigrated.Set(collector.RequestMigrated); } -TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings) { +TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings, bool canMove) { auto request = MakeOperationRequest(settings); request.set_table(table); - request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); - request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); + if (canMove) { + request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); + request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); + } else { + *request.mutable_rows()->mutable_type() = TProtoAccessor::GetProto(rows.GetType()); + *request.mutable_rows()->mutable_value() = rows.GetProto(); + } auto promise = NewPromise(); diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h index 04e168d20f31..5d2b89a28cb8 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h @@ -134,7 +134,7 @@ class TTableClient::TImpl: public TClientImplCommon, public void SetStatCollector(const NSdkStats::TStatCollector::TClientStatCollector& collector); - TAsyncBulkUpsertResult BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings); + TAsyncBulkUpsertResult BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings, bool canMove); TAsyncBulkUpsertResult BulkUpsert(const TString& table, EDataFormat format, const TString& data, const TString& schema, const TBulkUpsertSettings& settings); diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index 52ca6a69f368..ec6f4a9a1b91 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -1459,7 +1459,7 @@ NThreading::TFuture TTableClient::Stop() { TAsyncBulkUpsertResult TTableClient::BulkUpsert(const TString& table, TValue&& rows, const TBulkUpsertSettings& settings) { - return Impl_->BulkUpsert(table, std::move(rows), settings); + return Impl_->BulkUpsert(table, std::move(rows), settings, rows.Impl_.use_count() == 1); } TAsyncBulkUpsertResult TTableClient::BulkUpsert(const TString& table, EDataFormat format, diff --git a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/value/value.h b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/value/value.h index 61eb9ce2c0f2..a43f7f4aacba 100644 --- a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/value/value.h +++ b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/value/value.h @@ -262,10 +262,17 @@ struct TUuidValue { } Buf_; }; +namespace NTable { + +class TTableClient; + +} // namespace NTable + //! Representation of YDB value. class TValue { friend class TValueParser; friend class TProtoAccessor; + friend class ::NYdb::Dev::NTable::TTableClient; public: TValue(const TType& type, const Ydb::Value& valueProto); TValue(const TType& type, Ydb::Value&& valueProto); diff --git a/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp b/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp index 61f3572fa60d..163c7a477ee8 100644 --- a/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp +++ b/ydb/public/sdk/cpp/src/client/table/impl/table_client.cpp @@ -989,11 +989,16 @@ void TTableClient::TImpl::SetStatCollector(const NSdkStats::TStatCollector::TCli SessionRemovedDueBalancing.Set(collector.SessionRemovedDueBalancing); } -TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings) { +TAsyncBulkUpsertResult TTableClient::TImpl::BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings, bool canMove) { auto request = MakeOperationRequest(settings); request.set_table(TStringType{table}); - request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); - request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); + if (canMove) { + request.mutable_rows()->mutable_type()->Swap(&rows.GetType().GetProto()); + request.mutable_rows()->mutable_value()->Swap(&rows.GetProto()); + } else { + *request.mutable_rows()->mutable_type() = TProtoAccessor::GetProto(rows.GetType()); + *request.mutable_rows()->mutable_value() = rows.GetProto(); + } auto promise = NewPromise(); diff --git a/ydb/public/sdk/cpp/src/client/table/impl/table_client.h b/ydb/public/sdk/cpp/src/client/table/impl/table_client.h index b269c24dedb1..d1693310a83b 100644 --- a/ydb/public/sdk/cpp/src/client/table/impl/table_client.h +++ b/ydb/public/sdk/cpp/src/client/table/impl/table_client.h @@ -138,7 +138,7 @@ class TTableClient::TImpl: public TClientImplCommon, public void SetStatCollector(const NSdkStats::TStatCollector::TClientStatCollector& collector); - TAsyncBulkUpsertResult BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings); + TAsyncBulkUpsertResult BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings, bool canMove); TAsyncBulkUpsertResult BulkUpsert(const std::string& table, EDataFormat format, const std::string& data, const std::string& schema, const TBulkUpsertSettings& settings); diff --git a/ydb/public/sdk/cpp/src/client/table/table.cpp b/ydb/public/sdk/cpp/src/client/table/table.cpp index 65b271ddc04d..fd64125bfedd 100644 --- a/ydb/public/sdk/cpp/src/client/table/table.cpp +++ b/ydb/public/sdk/cpp/src/client/table/table.cpp @@ -1460,7 +1460,7 @@ NThreading::TFuture TTableClient::Stop() { TAsyncBulkUpsertResult TTableClient::BulkUpsert(const std::string& table, TValue&& rows, const TBulkUpsertSettings& settings) { - return Impl_->BulkUpsert(table, std::move(rows), settings); + return Impl_->BulkUpsert(table, std::move(rows), settings, rows.Impl_.use_count() == 1); } TAsyncBulkUpsertResult TTableClient::BulkUpsert(const std::string& table, EDataFormat format,