mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Merge pull request #17458 from ClickHouse/merge-expressions
Merge expressions
This commit is contained in:
commit
57f40e4260
@ -349,6 +349,16 @@ void ActionsDAG::removeUnusedActions()
|
|||||||
stack.push(node);
|
stack.push(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// We cannot remove arrayJoin because it changes the number of rows.
|
||||||
|
for (auto & node : nodes)
|
||||||
|
{
|
||||||
|
if (node.type == ActionType::ARRAY_JOIN && visited_nodes.count(&node) == 0)
|
||||||
|
{
|
||||||
|
visited_nodes.insert(&node);
|
||||||
|
stack.push(&node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (!stack.empty())
|
while (!stack.empty())
|
||||||
{
|
{
|
||||||
auto * node = stack.top();
|
auto * node = stack.top();
|
||||||
@ -552,6 +562,15 @@ bool ActionsDAG::hasArrayJoin() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ActionsDAG::hasStatefulFunctions() const
|
||||||
|
{
|
||||||
|
for (const auto & node : nodes)
|
||||||
|
if (node.type == ActionType::FUNCTION && node.function_base->isStateful())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool ActionsDAG::empty() const
|
bool ActionsDAG::empty() const
|
||||||
{
|
{
|
||||||
for (const auto & node : nodes)
|
for (const auto & node : nodes)
|
||||||
@ -670,6 +689,111 @@ ActionsDAGPtr ActionsDAG::makeConvertingActions(
|
|||||||
return actions_dag;
|
return actions_dag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ActionsDAGPtr ActionsDAG::merge(ActionsDAG && first, ActionsDAG && second)
|
||||||
|
{
|
||||||
|
/// first: x (1), x (2), y ==> x (2), z, x (3)
|
||||||
|
/// second: x (1), x (2), x (3) ==> x (3), x (2), x (1)
|
||||||
|
/// merge: x (1), x (2), x (3), y =(first)=> x (3), y, x (2), z, x (4) =(second)=> y, z, x (4), x (2), x (3)
|
||||||
|
|
||||||
|
/// Will store merged result in `first`.
|
||||||
|
|
||||||
|
/// This map contains nodes which should be removed from `first` index, cause they are used as inputs for `second`.
|
||||||
|
std::unordered_set<Node *> removed_first_result;
|
||||||
|
/// Map inputs of `second` to nodes of `first`.
|
||||||
|
std::unordered_map<Node *, Node *> inputs_map;
|
||||||
|
|
||||||
|
/// Update inputs list.
|
||||||
|
{
|
||||||
|
/// Index may have multiple columns with same name. They also may be used by `second`. Order is important.
|
||||||
|
std::unordered_map<std::string_view, std::list<Node *>> first_result;
|
||||||
|
for (auto & node : first.index)
|
||||||
|
first_result[node->result_name].push_back(node);
|
||||||
|
|
||||||
|
for (auto & node : second.inputs)
|
||||||
|
{
|
||||||
|
auto it = first_result.find(node->result_name);
|
||||||
|
if (it == first_result.end() || it->second.empty())
|
||||||
|
{
|
||||||
|
if (first.settings.project_input)
|
||||||
|
throw Exception(ErrorCodes::LOGICAL_ERROR,
|
||||||
|
"Cannot find column {} in ActionsDAG result", node->result_name);
|
||||||
|
|
||||||
|
first.inputs.push_back(node);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inputs_map[node] = it->second.front();
|
||||||
|
removed_first_result.emplace(it->second.front());
|
||||||
|
it->second.pop_front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Replace inputs from `second` to nodes from `first` result.
|
||||||
|
for (auto & node : second.nodes)
|
||||||
|
{
|
||||||
|
for (auto & child : node.children)
|
||||||
|
{
|
||||||
|
if (child->type == ActionType::INPUT)
|
||||||
|
{
|
||||||
|
auto it = inputs_map.find(child);
|
||||||
|
if (it != inputs_map.end())
|
||||||
|
child = it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto & node : second.index)
|
||||||
|
{
|
||||||
|
if (node->type == ActionType::INPUT)
|
||||||
|
{
|
||||||
|
auto it = inputs_map.find(node);
|
||||||
|
if (it != inputs_map.end())
|
||||||
|
node = it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Update index.
|
||||||
|
if (second.settings.project_input)
|
||||||
|
{
|
||||||
|
first.index.swap(second.index);
|
||||||
|
first.settings.project_input = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/// Remove `second` inputs from index.
|
||||||
|
for (auto it = first.index.begin(); it != first.index.end();)
|
||||||
|
{
|
||||||
|
auto cur = it;
|
||||||
|
++it;
|
||||||
|
|
||||||
|
if (removed_first_result.count(*cur))
|
||||||
|
first.index.remove(cur);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto * node : second.index)
|
||||||
|
first.index.insert(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
first.nodes.splice(first.nodes.end(), std::move(second.nodes));
|
||||||
|
|
||||||
|
#if USE_EMBEDDED_COMPILER
|
||||||
|
if (first.compilation_cache == nullptr)
|
||||||
|
first.compilation_cache = second.compilation_cache;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
first.settings.max_temporary_columns = std::max(first.settings.max_temporary_columns, second.settings.max_temporary_columns);
|
||||||
|
first.settings.max_temporary_non_const_columns = std::max(first.settings.max_temporary_non_const_columns, second.settings.max_temporary_non_const_columns);
|
||||||
|
first.settings.min_count_to_compile_expression = std::max(first.settings.min_count_to_compile_expression, second.settings.min_count_to_compile_expression);
|
||||||
|
first.settings.projected_output = second.settings.projected_output;
|
||||||
|
|
||||||
|
/// Drop unused inputs and, probably, some actions.
|
||||||
|
first.removeUnusedActions();
|
||||||
|
|
||||||
|
return std::make_shared<ActionsDAG>(std::move(first));
|
||||||
|
}
|
||||||
|
|
||||||
ActionsDAGPtr ActionsDAG::splitActionsBeforeArrayJoin(const NameSet & array_joined_columns)
|
ActionsDAGPtr ActionsDAG::splitActionsBeforeArrayJoin(const NameSet & array_joined_columns)
|
||||||
{
|
{
|
||||||
/// Split DAG into two parts.
|
/// Split DAG into two parts.
|
||||||
|
@ -143,6 +143,15 @@ public:
|
|||||||
map.erase(it);
|
map.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove(std::list<Node *>::iterator it)
|
||||||
|
{
|
||||||
|
auto map_it = map.find((*it)->result_name);
|
||||||
|
if (map_it != map.end() && map_it->second == it)
|
||||||
|
map.erase(map_it);
|
||||||
|
|
||||||
|
list.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
void swap(Index & other)
|
void swap(Index & other)
|
||||||
{
|
{
|
||||||
list.swap(other.list);
|
list.swap(other.list);
|
||||||
@ -176,6 +185,7 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
ActionsDAG() = default;
|
ActionsDAG() = default;
|
||||||
|
ActionsDAG(ActionsDAG &&) = default;
|
||||||
ActionsDAG(const ActionsDAG &) = delete;
|
ActionsDAG(const ActionsDAG &) = delete;
|
||||||
ActionsDAG & operator=(const ActionsDAG &) = delete;
|
ActionsDAG & operator=(const ActionsDAG &) = delete;
|
||||||
explicit ActionsDAG(const NamesAndTypesList & inputs_);
|
explicit ActionsDAG(const NamesAndTypesList & inputs_);
|
||||||
@ -222,6 +232,7 @@ public:
|
|||||||
ActionsDAGPtr splitActionsBeforeArrayJoin(const NameSet & array_joined_columns);
|
ActionsDAGPtr splitActionsBeforeArrayJoin(const NameSet & array_joined_columns);
|
||||||
|
|
||||||
bool hasArrayJoin() const;
|
bool hasArrayJoin() const;
|
||||||
|
bool hasStatefulFunctions() const;
|
||||||
bool empty() const; /// If actions only contain inputs.
|
bool empty() const; /// If actions only contain inputs.
|
||||||
|
|
||||||
const ActionsSettings & getSettings() const { return settings; }
|
const ActionsSettings & getSettings() const { return settings; }
|
||||||
@ -248,6 +259,12 @@ public:
|
|||||||
MatchColumnsMode mode,
|
MatchColumnsMode mode,
|
||||||
bool ignore_constant_values = false); /// Do not check that constants are same. Use value from result_header.
|
bool ignore_constant_values = false); /// Do not check that constants are same. Use value from result_header.
|
||||||
|
|
||||||
|
/// Create ActionsDAG which represents expression equivalent to applying lhs and rhs actions consequently.
|
||||||
|
/// Is used to replace `(first -> second)` expression chain to single `merge(first, second)` expression.
|
||||||
|
/// If first.settings.project_input is set, then outputs of `first` must include inputs of `second`.
|
||||||
|
/// Otherwise, any two actions may be combined.
|
||||||
|
static ActionsDAGPtr merge(ActionsDAG && first, ActionsDAG && second);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Node & addNode(Node node, bool can_replace = false);
|
Node & addNode(Node node, bool can_replace = false);
|
||||||
Node & getNode(const std::string & name);
|
Node & getNode(const std::string & name);
|
||||||
|
@ -484,6 +484,38 @@ static void tryLiftUpArrayJoin(QueryPlan::Node * parent_node, QueryPlan::Node *
|
|||||||
: filter_step->updateInputStream(array_join_step->getOutputStream(), true);
|
: filter_step->updateInputStream(array_join_step->getOutputStream(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tryMergeExpressions(QueryPlan::Node * parent_node, QueryPlan::Node * child_node)
|
||||||
|
{
|
||||||
|
auto & parent = parent_node->step;
|
||||||
|
auto & child = child_node->step;
|
||||||
|
/// TODO: FilterStep
|
||||||
|
auto * parent_expr = typeid_cast<ExpressionStep *>(parent.get());
|
||||||
|
auto * child_expr = typeid_cast<ExpressionStep *>(child.get());
|
||||||
|
|
||||||
|
if (parent_expr && child_expr)
|
||||||
|
{
|
||||||
|
const auto & child_actions = child_expr->getExpression();
|
||||||
|
const auto & parent_actions = parent_expr->getExpression();
|
||||||
|
|
||||||
|
/// We cannot combine actions with arrayJoin and stateful function because we not always can reorder them.
|
||||||
|
/// Example: select rowNumberInBlock() from (select arrayJoin([1, 2]))
|
||||||
|
/// Such a query will return two zeroes if we combine actions together.
|
||||||
|
if (child_actions->hasArrayJoin() && parent_actions->hasStatefulFunctions())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto merged = ActionsDAG::merge(std::move(*child_actions), std::move(*parent_actions));
|
||||||
|
|
||||||
|
auto expr = std::make_unique<ExpressionStep>(child_expr->getInputStreams().front(), merged);
|
||||||
|
expr->setStepDescription(parent_expr->getStepDescription() + " + " + child_expr->getStepDescription());
|
||||||
|
|
||||||
|
parent_node->step = std::move(expr);
|
||||||
|
parent_node->children.swap(child_node->children);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void QueryPlan::optimize()
|
void QueryPlan::optimize()
|
||||||
{
|
{
|
||||||
struct Frame
|
struct Frame
|
||||||
@ -503,7 +535,11 @@ void QueryPlan::optimize()
|
|||||||
{
|
{
|
||||||
/// First entrance, try push down.
|
/// First entrance, try push down.
|
||||||
if (frame.node->children.size() == 1)
|
if (frame.node->children.size() == 1)
|
||||||
|
{
|
||||||
tryPushDownLimit(frame.node->step, frame.node->children.front());
|
tryPushDownLimit(frame.node->step, frame.node->children.front());
|
||||||
|
|
||||||
|
while (tryMergeExpressions(frame.node, frame.node->children.front()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame.next_child < frame.node->children.size())
|
if (frame.next_child < frame.node->children.size())
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Header: x UInt8
|
Header: x UInt8
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
Header: dummy UInt8
|
|
||||||
1 UInt8
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
Header: dummy UInt8
|
Header: dummy UInt8
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
(Expression)
|
|
||||||
ExpressionTransform
|
|
||||||
(Expression)
|
(Expression)
|
||||||
ExpressionTransform
|
ExpressionTransform
|
||||||
(Aggregating)
|
(Aggregating)
|
||||||
|
@ -1,324 +1,252 @@
|
|||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Distinct
|
Distinct
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Union
|
Union
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
Expression (Projection)
|
Expression (Projection + Before ORDER BY and SELECT)
|
||||||
Expression (Before ORDER BY and SELECT)
|
|
||||||
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
SettingQuotaAndLimits (Set limits and quota after reading from storage)
|
||||||
ReadFromStorage (SystemOne)
|
ReadFromStorage (SystemOne)
|
||||||
|
Loading…
Reference in New Issue
Block a user