diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2015-03-25 18:27:10 +0100 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2015-06-30 23:07:14 +0300 |
commit | c6aee27b73232fc6ba3e8b55adbb0abba4f0171b (patch) | |
tree | c996b7f96ff4d063b2112e8b863825a2cff906b2 /sql/sql_explain.cc | |
parent | 498a264d19f041c36d71e41a32c16ac40a014a3e (diff) | |
download | mariadb-git-c6aee27b73232fc6ba3e8b55adbb0abba4f0171b.tar.gz |
MDEV-7811: EXPLAIN/ANALYZE FORMAT=JSON should show subquery cache
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 21959423084..210700a2804 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"; @@ -543,6 +544,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++) @@ -640,6 +642,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]; @@ -757,17 +783,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); Filesort_tracker *first_table_sort= NULL; bool first_table_sort_used= false; |