
revision-id: f92ea8de8df67515540980a182bda52d35a6946a (mariadb-10.5.0-239-gf92ea8de8df) parent(s): 5eda357ddfa23af6f0d9eb4327e907f59b501fb8 author: Sergei Petrunia committer: Sergei Petrunia timestamp: 2020-02-27 17:42:46 +0300 message: MDEV-21791: Packed Sort Keys: provide details in ANALYZE FORMAT=JSON. It's useful to know whether packed addon fields or sort-keys are used by the query. Unfortunately it's hard show such information in EXPLAIN[FORMAT=JSON] (and even if it was possible, it's not clear whether this level of detail would be appropriate there). Provide this information in ANALYZE FORMAT=JSON output. --- mysql-test/main/analyze_format_json.result | 1 + sql/filesort.cc | 2 ++ sql/sql_analyze_stmt.cc | 5 +++++ sql/sql_analyze_stmt.h | 14 ++++++++++++-- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/analyze_format_json.result b/mysql-test/main/analyze_format_json.result index ccef3a63592..ec3e21505dd 100644 --- a/mysql-test/main/analyze_format_json.result +++ b/mysql-test/main/analyze_format_json.result @@ -701,6 +701,7 @@ ANALYZE "r_used_priority_queue": false, "r_output_rows": 0, "r_buffer_size": "REPLACED", + "r_packed_keys": true, "temporary_table": { "filesort": { "sort_key": "(subquery#2)", diff --git a/sql/filesort.cc b/sql/filesort.cc index 33f595c02fb..9e15689f892 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -278,6 +278,8 @@ SORT_INFO *filesort(THD *thd, TABLE *table, Filesort *filesort, param.try_to_pack_sortkeys(); param.try_to_pack_addons(thd->variables.max_length_for_sort_data); + tracker->report_data_format(param.using_packed_sortkeys(), + param.using_packed_addons()); param.using_pq= false; if ((multi_byte_charset || param.using_packed_sortkeys()) && diff --git a/sql/sql_analyze_stmt.cc b/sql/sql_analyze_stmt.cc index fdabcf1e494..6c07c8247e3 100644 --- a/sql/sql_analyze_stmt.cc +++ b/sql/sql_analyze_stmt.cc @@ -78,6 +78,11 @@ void Filesort_tracker::print_json_members(Json_writer *writer) else writer->add_size(sort_buffer_size); } + + if (r_packed_keys) + writer->add_member("r_packed_keys").add_bool(true); + if (r_packed_addon_fields) + writer->add_member("r_packed_addon_fields").add_bool(true); } void attach_gap_time_tracker(THD *thd, Gap_time_tracker *gap_tracker, diff --git a/sql/sql_analyze_stmt.h b/sql/sql_analyze_stmt.h index 9d5151c3be2..d6589355874 100644 --- a/sql/sql_analyze_stmt.h +++ b/sql/sql_analyze_stmt.h @@ -221,7 +221,8 @@ class Filesort_tracker : public Sql_alloc time_tracker(do_timing), r_limit(0), r_used_pq(0), r_examined_rows(0), r_sorted_rows(0), r_output_rows(0), sort_passes(0), - sort_buffer_size(0) + sort_buffer_size(0), + r_packed_keys(false), r_packed_addon_fields(false) {} /* Functions that filesort uses to report various things about its execution */ @@ -263,7 +264,13 @@ class Filesort_tracker : public Sql_alloc else sort_buffer_size= bufsize; } - + + inline void report_data_format(bool keys_packed, bool addons_packed) + { + r_packed_keys= keys_packed; + r_packed_addon_fields= addons_packed; + } + /* Functions to get the statistics */ void print_json_members(Json_writer *writer); @@ -322,6 +329,9 @@ class Filesort_tracker : public Sql_alloc other - value */ ulonglong sort_buffer_size; + + bool r_packed_keys; + bool r_packed_addon_fields; };