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

View File

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