summaryrefslogtreecommitdiff
path: root/sql/sql_explain.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r--sql/sql_explain.cc156
1 files changed, 37 insertions, 119 deletions
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc
index 593a2dc0a88..f3001d5942a 100644
--- a/sql/sql_explain.cc
+++ b/sql/sql_explain.cc
@@ -697,14 +697,6 @@ bool Explain_node::print_explain_json_cache(Json_writer *writer,
}
-#if 0
-void Explain_select::replace_table(uint idx, Explain_table_access *new_tab)
-{
- delete join_tabs[idx];
- join_tabs[idx]= new_tab;
-}
-#endif
-
Explain_basic_join::~Explain_basic_join()
{
if (join_tabs)
@@ -755,35 +747,23 @@ int Explain_select::print_explain(Explain_query *query,
}
else
{
- bool using_tmp;
- bool using_fs;
+ bool using_tmp= false;
+ bool using_fs= false;
- if (is_analyze)
+ for (Explain_aggr_node *node= aggr_tree; node; node= node->child)
{
- /*
- Get the data about "Using temporary; Using filesort" from execution
- tracking system.
- */
- using_tmp= false;
- using_fs= false;
- Sort_and_group_tracker::Iterator iter(&ops_tracker);
- enum_qep_action action;
- Filesort_tracker *dummy;
-
- while ((action= iter.get_next(&dummy)) != EXPL_ACTION_EOF)
+ switch (node->get_type())
{
- if (action == EXPL_ACTION_FILESORT)
- using_fs= true;
- else if (action == EXPL_ACTION_TEMPTABLE)
+ case AGGR_OP_TEMP_TABLE:
using_tmp= true;
+ break;
+ case AGGR_OP_FILESORT:
+ using_fs= true;
+ break;
+ default:
+ break;
}
}
- else
- {
- /* Use imprecise "estimates" we got with the query plan */
- using_tmp= using_temporary;
- using_fs= using_filesort;
- }
for (uint i=0; i< n_join_tabs; i++)
{
@@ -877,88 +857,34 @@ void Explain_select::print_explain_json(Explain_query *query,
}
}
- Filesort_tracker *first_table_sort= NULL;
- bool first_table_sort_used= false;
int started_objects= 0;
+
+ Explain_aggr_node *node= aggr_tree;
- if (is_analyze)
- {
- /* ANALYZE has collected this part of query plan independently */
- if (ops_tracker.had_varied_executions())
- {
- writer->add_member("varied-sort-and-tmp").start_object();
- started_objects++;
- }
- else
- {
- Sort_and_group_tracker::Iterator iter(&ops_tracker);
- enum_qep_action action;
- Filesort_tracker *fs_tracker;
-
- while ((action= iter.get_next(&fs_tracker)) != EXPL_ACTION_EOF)
- {
- if (action == EXPL_ACTION_FILESORT)
- {
- if (iter.is_last_element())
- {
- first_table_sort= fs_tracker;
- break;
- }
- writer->add_member("filesort").start_object();
- started_objects++;
- fs_tracker->print_json_members(writer);
- }
- else if (action == EXPL_ACTION_TEMPTABLE)
- {
- writer->add_member("temporary_table").start_object();
- started_objects++;
- /*
- if (tmp == EXPL_TMP_TABLE_BUFFER)
- func= "buffer";
- else if (tmp == EXPL_TMP_TABLE_GROUP)
- func= "group-by";
- else
- func= "distinct";
- writer->add_member("function").add_str(func);
- */
- }
- else if (action == EXPL_ACTION_REMOVE_DUPS)
- {
- writer->add_member("duplicate_removal").start_object();
- started_objects++;
- }
- else
- DBUG_ASSERT(0);
- }
- }
-
- if (first_table_sort)
- first_table_sort_used= true;
- }
- else
+ for (; node; node= node->child)
{
- /* This is just EXPLAIN. Try to produce something meaningful */
- if (using_temporary)
+ switch (node->get_type())
{
- started_objects= 1;
- if (using_filesort)
+ case AGGR_OP_TEMP_TABLE:
+ writer->add_member("temporary_table").start_object();
+ break;
+ case AGGR_OP_FILESORT:
{
- started_objects++;
writer->add_member("filesort").start_object();
+ if (is_analyze)
+ ((Explain_aggr_filesort*)node)->tracker->print_json_members(writer);
+ break;
}
- writer->add_member("temporary_table").start_object();
- writer->add_member("function").add_str("buffer");
- }
- else
- {
- if (using_filesort)
- first_table_sort_used= true;
+ case AGGR_OP_REMOVE_DUPLICATES:
+ writer->add_member("duplicate_removal").start_object();
+ break;
+ default:
+ DBUG_ASSERT(0);
}
+ started_objects++;
}
- Explain_basic_join::print_explain_json_interns(query, writer, is_analyze,
- first_table_sort,
- first_table_sort_used);
+ Explain_basic_join::print_explain_json_interns(query, writer, is_analyze);
for (;started_objects; started_objects--)
writer->end_object();
@@ -978,7 +904,7 @@ void Explain_basic_join::print_explain_json(Explain_query *query,
writer->add_member("query_block").start_object();
writer->add_member("select_id").add_ll(select_id);
- print_explain_json_interns(query, writer, is_analyze, NULL, false);
+ print_explain_json_interns(query, writer, is_analyze);
writer->end_object();
}
@@ -987,9 +913,7 @@ void Explain_basic_join::print_explain_json(Explain_query *query,
void Explain_basic_join::
print_explain_json_interns(Explain_query *query,
Json_writer *writer,
- bool is_analyze,
- Filesort_tracker *first_table_sort,
- bool first_table_sort_used)
+ bool is_analyze)
{
Json_writer_nesting_guard guard(writer);
for (uint i=0; i< n_join_tabs; i++)
@@ -997,12 +921,7 @@ print_explain_json_interns(Explain_query *query,
if (join_tabs[i]->start_dups_weedout)
writer->add_member("duplicates_removal").start_object();
- join_tabs[i]->print_explain_json(query, writer, is_analyze,
- first_table_sort,
- first_table_sort_used);
-
- first_table_sort= NULL;
- first_table_sort_used= false;
+ join_tabs[i]->print_explain_json(query, writer, is_analyze);
if (join_tabs[i]->end_dups_weedout)
writer->end_object();
@@ -1294,7 +1213,7 @@ int Explain_table_access::print_explain(select_result_sink *output, uint8 explai
extra_buf.append(STRING_WITH_LEN("Using temporary"));
}
- if (using_filesort)
+ if (using_filesort || this->using_filesort)
{
if (first)
first= false;
@@ -1493,13 +1412,11 @@ void add_json_keyset(Json_writer *writer, const char *elem_name,
void Explain_table_access::print_explain_json(Explain_query *query,
Json_writer *writer,
- bool is_analyze,
- Filesort_tracker *fs_tracker,
- bool first_table_sort_used)
+ bool is_analyze)
{
Json_writer_nesting_guard guard(writer);
- if (first_table_sort_used)
+ if (using_filesort)
{
/* filesort was invoked on this join tab before doing the join with the rest */
writer->add_member("read_sorted_file").start_object();
@@ -1526,6 +1443,7 @@ void Explain_table_access::print_explain_json(Explain_query *query,
}
}
writer->add_member("filesort").start_object();
+
if (is_analyze)
fs_tracker->print_json_members(writer);
}
@@ -1718,7 +1636,7 @@ void Explain_table_access::print_explain_json(Explain_query *query,
writer->end_object();
}
- if (first_table_sort_used)
+ if (using_filesort)
{
writer->end_object(); // filesort
writer->end_object(); // read_sorted_file