diff options
author | lucius <[email protected]> | 2025-10-09 13:01:25 +0300 |
---|---|---|
committer | lucius <[email protected]> | 2025-10-09 13:33:39 +0300 |
commit | e7c5ac7fc2f710e8fe0223ec4ed56ecda316b9c4 (patch) | |
tree | b7dc4fb5d2693c5be545e14831c2eb802f8f62df /yql/essentials/sql | |
parent | 65e378dec032b5dde3099702f121524cf022b9e6 (diff) |
YT-25914: [cbo] use column DataWeight + update cost function + add version pragma
Новая кост-функция для cbo. Под флагом чтобы удобнее сравнивать со старой.
2 изменения:
- Для оценки размера входных таблиц используется поколоночный dataweight (если есть), а не таблица целиком
- В самой кост-функции убран outputSize, чтобы он не учитывался дважды: он неявно учтен в каждом следующем джоине как левый либо правый inputSize, а размер результата последнего джоина не зависит от перестановки джоинов
commit_hash:d130848393114b1b4383035381dba7767aac62fb
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r-- | yql/essentials/sql/v1/context.h | 1 | ||||
-rw-r--r-- | yql/essentials/sql/v1/query.cpp | 5 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_query.cpp | 16 |
3 files changed, 22 insertions, 0 deletions
diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h index 1f6d660c7fb..49041cd11b2 100644 --- a/yql/essentials/sql/v1/context.h +++ b/yql/essentials/sql/v1/context.h @@ -328,6 +328,7 @@ public: bool DqEngineEnable = false; bool DqEngineForce = false; TString CostBasedOptimizer; + TMaybe<ui32> CostBasedOptimizerVersion; TMaybe<bool> JsonQueryReturnsJsonDocument; TMaybe<bool> AnsiInForEmptyOrNullableItemsCollections; TMaybe<bool> AnsiRankForNullableKeys = true; diff --git a/yql/essentials/sql/v1/query.cpp b/yql/essentials/sql/v1/query.cpp index e88f03b0c3c..f106b9344d4 100644 --- a/yql/essentials/sql/v1/query.cpp +++ b/yql/essentials/sql/v1/query.cpp @@ -3324,6 +3324,11 @@ public: BuildQuotedAtom(Pos_, "CostBasedOptimizer"), BuildQuotedAtom(Pos_, ctx.CostBasedOptimizer)))); } + if (ctx.CostBasedOptimizerVersion) { + currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, + BuildQuotedAtom(Pos_, "CostBasedOptimizerVersion"), BuildQuotedAtom(Pos_, ToString(*ctx.CostBasedOptimizerVersion))))); + } + if (ctx.JsonQueryReturnsJsonDocument.Defined()) { TString pragmaName = "DisableJsonQueryReturnsJsonDocument"; if (*ctx.JsonQueryReturnsJsonDocument) { diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp index bb846e93012..813423b0540 100644 --- a/yql/essentials/sql/v1/sql_query.cpp +++ b/yql/essentials/sql/v1/sql_query.cpp @@ -3388,6 +3388,22 @@ THashMap<TString, TPragmaDescr> PragmaDescrs{ } return TNodePtr{}; }), + TableElemExt("CostBasedOptimizerVersion", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() == 1 && values[0].GetLiteral()) { + ui32 version; + if (!TryFromString(*values[0].GetLiteral(), version)) { + query.Error() << "Expected integer argument for: " << pragma; + return {}; + } + const ui32 maxCBOVersion = 1; + if (version > maxCBOVersion) { + query.Error() << "Expected value <= " << maxCBOVersion << " for: " << pragma; + } + ctx.CostBasedOptimizerVersion = version; + } + return TNodePtr{}; + }), TableElemExt("DisableCompactNamedExprs", [](CB_SIG) -> TMaybe<TNodePtr> { auto& ctx = query.Context(); if (!ctx.Warning(ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA, [](auto& out) { |