From 74dc0cc8e307bb6431e125ab365af961dcaa21f0 Mon Sep 17 00:00:00 2001 From: Maxim Kovalev Date: Wed, 24 Jan 2024 13:49:25 +0000 Subject: [PATCH] YQL-16720: Skip hybrid for desc sort --- .../yql/providers/yt/provider/yql_yt_dq_hybrid.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_dq_hybrid.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_dq_hybrid.cpp index 6ea6e1c057eb..1ced14fa6f39 100644 --- a/ydb/library/yql/providers/yt/provider/yql_yt_dq_hybrid.cpp +++ b/ydb/library/yql/providers/yt/provider/yql_yt_dq_hybrid.cpp @@ -79,6 +79,11 @@ class TYtDqHybridTransformer : public TOptimizeTransformerBase { return !HasSettingsExcept(*operation.Ref().Child(4U), DqOpSupportedSettings); } + bool HasDescOrderOutput(const TYtOutputOpBase& operation) const { + TYqlRowSpecInfo outRowSpec(operation.Output().Item(0).RowSpec()); + return outRowSpec.IsSorted() && outRowSpec.HasAuxColumns(); + } + std::optional> CanReadHybrid(const TYtSection& section) const { if (HasSettingsExcept(section.Settings().Ref(), DqReadSupportedSettings)) return std::nullopt; @@ -266,6 +271,10 @@ class TYtDqHybridTransformer : public TOptimizeTransformerBase { const auto chunksLimit = State_->Configuration->MaxChunksForDqRead.Get().GetOrElse(DEFAULT_MAX_CHUNKS_FOR_DQ_READ); if (const auto stat = CanReadHybrid(sort.Input().Item(0))) { if (stat->front() <= sizeLimit && stat->back() <= chunksLimit) { + if (HasDescOrderOutput(sort)) { + PushStat("HybridSkipDescSort"); + return node; + } YQL_CLOG(INFO, ProviderYt) << "Sort on DQ with equivalent input size " << stat->front() << " and " << stat->back() << " chunks."; PushStat("HybridTry"); PushHybridStat("Try", node.Raw()->Content()); @@ -287,6 +296,10 @@ class TYtDqHybridTransformer : public TOptimizeTransformerBase { const auto chunksLimit = State_->Configuration->MaxChunksForDqRead.Get().GetOrElse(DEFAULT_MAX_CHUNKS_FOR_DQ_READ); if (const auto stat = CanReadHybrid(merge.Input().Item(0))) { if (stat->front() <= sizeLimit && stat->back() <= chunksLimit) { + if (HasDescOrderOutput(merge)) { + PushStat("HybridSkipDescSort"); + return node; + } YQL_CLOG(INFO, ProviderYt) << "Merge on DQ with equivalent input size " << stat->front() << " and " << stat->back() << " chunks."; PushStat("HybridTry"); PushHybridStat("Try", node.Raw()->Content());