ret += str;
ret += "\n";
++level;
}
// 遍历所有的children iterator, 递归输出计划信息
for (const RowIterator::Child &child : iterator->children()) {
if (!child.description.empty()) {
ret.append(level * 4, ' ');
ret.append("-> ");
ret.append(child.description);
ret.append("\n");
ret += PrintQueryPlan(level + 1, child.iterator);
} else {
ret += PrintQueryPlan(level, child.iterator);
}
}
//
if (iterator->join_for_explain() != nullptr) {
for (const auto &child :
GetIteratorsFromSelectList(iterator->join_for_explain())) {
ret.append(top_level * 4, ' ');
ret.append("-> ");
ret.append(child.description);
ret.append("\n");
ret += PrintQueryPlan(top_level + 1, child.iterator);
}
}
return ret;
}
FullDebugString()
通过本方法输出一个iterator的完整的计划信息,包括iterator本身的信息,cost信息和执行信息
vector<string> FullDebugString(const THD *thd, const RowIterator &iterator) {
vector<string> ret = iterator.DebugString(); // 生成iterator的计划信息
if (iterator.expected_rows() >= 0.0) { // 生成cost info
// NOTE: We cannot use %f, since MSVC and GCC round 0.5 in different
// directions, so tests would not be reproducible between platforms.
// Format/round using my_gcvt() and llrint() instead.
char cost_as_string[FLOATING_POINT_BUFFER];
my_fcvt(iterator.estimated_cost(), 2, cost_as_string, /*error=*/nullptr);
char str[512];
snprintf(str, sizeof(str), " (cost=%s rows=%lld)", cost_as_string,
llrint(iterator.expected_rows()));
ret.back() += str;
}
if (thd->lex->is_explain_analyze) { // 生成执行信息
if (iterator.expected_rows() < 0.0) {
// We always want a double space between the iterator name and the costs.
ret.back().push_back(' ');
}
ret.back().push_back(' ');
ret.back() += iterator.TimingString();
}
return ret;
}
Parallel Query 中 Explain Format Tree 的变化
PolarDB的Parallel Query功能引入了新的exchange算子, 同时多阶段并行计划在生成计划的过程中是基于Cost选择的最优计划,我们对Parallel Query计划Format
Tree的输出信息进行了完善和补充, 下面是Parallel Query计划的Explain Format Tree的一个简单例子。
mysql> explain format=tree select a1, a3, sum(b2) sum from t1 join t2 where t1.a1 = t2.b2 and t2.b1 > 0 group by a1,a3 order by sum limit 10\G
*************************** 1. row ***************************
EXPLAIN: -> Limit: 10 row(s) (cost=2825.63 rows=10)
-> Sort: <temporary>.sum, limit input to 10 row(s) per chunk (cost=2825.63 rows=51)
相关文档
评论