mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-30 03:22:14 +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;
|
typedef std::vector<SharedPtr<IAST> > ASTs;
|
||||||
ASTs children;
|
ASTs children;
|
||||||
StringRange range;
|
StringRange range;
|
||||||
|
bool is_visited = false;
|
||||||
|
|
||||||
/** Строка с полным запросом.
|
/** Строка с полным запросом.
|
||||||
* Этот указатель не дает ее удалить, пока range в нее ссылается.
|
* Этот указатель не дает ее удалить, пока range в нее ссылается.
|
||||||
@ -63,6 +64,13 @@ public:
|
|||||||
/** Получить глубокую копию дерева. */
|
/** Получить глубокую копию дерева. */
|
||||||
virtual SharedPtr<IAST> clone() const = 0;
|
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 от всех детей.
|
* Обычно он содержит идентификатор элемента и getTreeID от всех детей.
|
||||||
*/
|
*/
|
||||||
|
@ -59,8 +59,6 @@ void LogicalExpressionsOptimizer::optimizeDisjunctiveEqualityChains()
|
|||||||
|
|
||||||
void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
||||||
{
|
{
|
||||||
std::set<IAST *> visited;
|
|
||||||
|
|
||||||
using Edge = std::pair<IAST *, IAST *>;
|
using Edge = std::pair<IAST *, IAST *>;
|
||||||
std::deque<Edge> to_visit;
|
std::deque<Edge> to_visit;
|
||||||
|
|
||||||
@ -72,7 +70,7 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
|||||||
auto to_node = edge.second;
|
auto to_node = edge.second;
|
||||||
|
|
||||||
to_visit.pop_back();
|
to_visit.pop_back();
|
||||||
visited.insert(to_node);
|
to_node->is_visited = true;
|
||||||
|
|
||||||
bool found_chain = false;
|
bool found_chain = false;
|
||||||
|
|
||||||
@ -121,7 +119,7 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
|||||||
{
|
{
|
||||||
if (typeid_cast<ASTSelectQuery *>(&*child) == nullptr)
|
if (typeid_cast<ASTSelectQuery *>(&*child) == nullptr)
|
||||||
{
|
{
|
||||||
if (!visited.count(&*child))
|
if (!child->is_visited)
|
||||||
to_visit.push_back(Edge(to_node, &*child));
|
to_visit.push_back(Edge(to_node, &*child));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -138,6 +136,8 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
select_query->clearVisited();
|
||||||
|
|
||||||
for (auto & chain : disjunctive_equality_chains_map)
|
for (auto & chain : disjunctive_equality_chains_map)
|
||||||
{
|
{
|
||||||
auto & equalities = chain.second;
|
auto & equalities = chain.second;
|
||||||
|
Loading…
Reference in New Issue
Block a user