diff options
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r-- | sql/sql_explain.cc | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index 36121aa1e01..f43d8e49f90 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -23,6 +23,7 @@ #include "sql_select.h" #include "my_json_writer.h" #include "opt_range.h" +#include "sql_expression_cache.h" const char * STR_DELETING_ALL_ROWS= "Deleting all rows"; const char * STR_IMPOSSIBLE_WHERE= "Impossible WHERE"; @@ -531,6 +532,7 @@ void Explain_union::print_explain_json(Explain_query *query, writer->add_null(); } + print_explain_json_cache(writer, is_analyze); writer->add_member("query_specifications").start_array(); for (int i= 0; i < (int) union_members.elements(); i++) @@ -628,6 +630,30 @@ void Explain_node::print_explain_json_for_children(Explain_query *query, } +void Explain_node::print_explain_json_cache(Json_writer *writer, + bool is_analyze) +{ + if (cache_stat) + { + cache_stat->flush_stat(); + writer->add_member("expression_cache").start_object(); + writer->add_member("state"). + add_str(Expression_cache_stat::state_str[cache_stat->state]); + if (is_analyze) + { + writer->add_member("r_hit").add_ll(cache_stat->hit); + writer->add_member("r_miss").add_ll(cache_stat->miss); + writer->add_member("r_loops").add_ll(cache_stat->hit + + cache_stat->miss); + writer->add_member("r_hit_ratio").add_ll(((double)cache_stat->hit)/ + ((double)(cache_stat->hit + + cache_stat->miss)) * 100.0); + } + writer->end_object(); + } +} + + void Explain_select::replace_table(uint idx, Explain_table_access *new_tab) { delete join_tabs[idx]; @@ -750,17 +776,19 @@ void Explain_select::print_explain_json(Explain_query *query, */ writer->add_member("query_block").start_object(); writer->add_member("select_id").add_ll(select_id); - + if (is_analyze && time_tracker.get_loops()) { writer->add_member("r_loops").add_ll(time_tracker.get_loops()); writer->add_member("r_total_time_ms").add_double(time_tracker.get_time_ms()); } + if (exec_const_cond) { writer->add_member("const_condition"); write_item(writer, exec_const_cond); } + print_explain_json_cache(writer, is_analyze); Explain_basic_join::print_explain_json_interns(query, writer, is_analyze); writer->end_object(); |