summaryrefslogtreecommitdiff
path: root/sql/sql_explain.cc
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2015-03-25 18:27:10 +0100
committerSergei Petrunia <psergey@askmonty.org>2015-06-30 23:07:14 +0300
commitc6aee27b73232fc6ba3e8b55adbb0abba4f0171b (patch)
treec996b7f96ff4d063b2112e8b863825a2cff906b2 /sql/sql_explain.cc
parent498a264d19f041c36d71e41a32c16ac40a014a3e (diff)
downloadmariadb-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.cc30
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;