dbms: Server: performance optimization [#METR-14875]

This commit is contained in:
Alexey Arno 2015-02-19 02:15:20 +03:00
parent 19a93cc0bf
commit a4f4c6a811
2 changed files with 12 additions and 4 deletions

View File

@ -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 от всех детей.
*/ */

View File

@ -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;