mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 01:51:59 +00:00
dbms: Server: performance optimization [#METR-14875]
This commit is contained in:
parent
19a93cc0bf
commit
a4f4c6a811
@ -32,6 +32,7 @@ public:
|
||||
typedef std::vector<SharedPtr<IAST> > ASTs;
|
||||
ASTs children;
|
||||
StringRange range;
|
||||
bool is_visited = false;
|
||||
|
||||
/** Строка с полным запросом.
|
||||
* Этот указатель не дает ее удалить, пока range в нее ссылается.
|
||||
@ -63,6 +64,13 @@ public:
|
||||
/** Получить глубокую копию дерева. */
|
||||
virtual SharedPtr<IAST> clone() const = 0;
|
||||
|
||||
void clearVisited()
|
||||
{
|
||||
is_visited = false;
|
||||
for (ASTs::iterator it = children.begin(); it != children.end(); ++it)
|
||||
(*it)->is_visited = false;
|
||||
}
|
||||
|
||||
/** Получить текст, который идентифицирует этот элемент и всё поддерево.
|
||||
* Обычно он содержит идентификатор элемента и getTreeID от всех детей.
|
||||
*/
|
||||
|
@ -59,8 +59,6 @@ void LogicalExpressionsOptimizer::optimizeDisjunctiveEqualityChains()
|
||||
|
||||
void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
||||
{
|
||||
std::set<IAST *> visited;
|
||||
|
||||
using Edge = std::pair<IAST *, IAST *>;
|
||||
std::deque<Edge> to_visit;
|
||||
|
||||
@ -72,7 +70,7 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
||||
auto to_node = edge.second;
|
||||
|
||||
to_visit.pop_back();
|
||||
visited.insert(to_node);
|
||||
to_node->is_visited = true;
|
||||
|
||||
bool found_chain = false;
|
||||
|
||||
@ -121,7 +119,7 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
||||
{
|
||||
if (typeid_cast<ASTSelectQuery *>(&*child) == nullptr)
|
||||
{
|
||||
if (!visited.count(&*child))
|
||||
if (!child->is_visited)
|
||||
to_visit.push_back(Edge(to_node, &*child));
|
||||
else
|
||||
{
|
||||
@ -138,6 +136,8 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
||||
}
|
||||
}
|
||||
|
||||
select_query->clearVisited();
|
||||
|
||||
for (auto & chain : disjunctive_equality_chains_map)
|
||||
{
|
||||
auto & equalities = chain.second;
|
||||
|
Loading…
Reference in New Issue
Block a user