diff options
-rw-r--r-- | mysql-test/r/analyze_stmt_orderby.result | 7 | ||||
-rw-r--r-- | sql/filesort.cc | 2 | ||||
-rw-r--r-- | sql/sql_analyze_stmt.cc | 23 | ||||
-rw-r--r-- | sql/sql_analyze_stmt.h | 30 | ||||
-rw-r--r-- | sql/sql_delete.cc | 2 | ||||
-rw-r--r-- | sql/sql_explain.h | 5 | ||||
-rw-r--r-- | sql/sql_table.cc | 2 |
7 files changed, 48 insertions, 23 deletions
diff --git a/mysql-test/r/analyze_stmt_orderby.result b/mysql-test/r/analyze_stmt_orderby.result index c4c4fbf4ce3..86259a78b11 100644 --- a/mysql-test/r/analyze_stmt_orderby.result +++ b/mysql-test/r/analyze_stmt_orderby.result @@ -40,6 +40,7 @@ ANALYZE "r_total_time_ms": "REPLACED", "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_limit": 5, "r_used_priority_queue": true, "r_output_rows": 6, @@ -140,6 +141,7 @@ ANALYZE "r_total_time_ms": "REPLACED", "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_used_priority_queue": false, "r_output_rows": 10000, "r_buffer_size": "REPLACED", @@ -204,6 +206,7 @@ ANALYZE "r_total_time_ms": "REPLACED", "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_limit": 4, "r_used_priority_queue": true, "r_output_rows": 4, @@ -288,6 +291,7 @@ ANALYZE "r_rows": 10, "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_used_priority_queue": false, "r_output_rows": 10, "r_buffer_size": "REPLACED", @@ -343,6 +347,7 @@ ANALYZE "r_total_time_ms": "REPLACED", "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_used_priority_queue": false, "r_output_rows": 10, "r_buffer_size": "REPLACED", @@ -451,11 +456,13 @@ ANALYZE "r_total_time_ms": "REPLACED", "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_limit": 1, "r_used_priority_queue": true, "r_output_rows": 2, "filesort": { "r_loops": 1, + "r_total_time_ms": "REPLACED", "r_used_priority_queue": false, "r_output_rows": 6, "r_buffer_size": "REPLACED", diff --git a/sql/filesort.cc b/sql/filesort.cc index 12085d9f733..ef91e227928 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -371,7 +371,6 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, err: my_free(param.tmp_buffer); - tracker->report_merge_passes_at_end(thd->query_plan_fsort_passes); if (!subselect || !subselect->is_uncacheable()) { table_sort.free_sort_buffer(); @@ -393,6 +392,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, outfile->end_of_file=save_pos; } } + tracker->report_merge_passes_at_end(thd->query_plan_fsort_passes); if (error) { int kill_errno= thd->killed_errno(); diff --git a/sql/sql_analyze_stmt.cc b/sql/sql_analyze_stmt.cc index da1e970d0b8..5e6774bd539 100644 --- a/sql/sql_analyze_stmt.cc +++ b/sql/sql_analyze_stmt.cc @@ -26,29 +26,38 @@ void Filesort_tracker::print_json_members(Json_writer *writer) { const char *varied_str= "(varied across executions)"; - writer->add_member("r_loops").add_ll(r_loops); + writer->add_member("r_loops").add_ll(get_r_loops()); + if (get_r_loops() && time_tracker.timed) + { + writer->add_member("r_total_time_ms"). + add_double(time_tracker.get_time_ms()); + } if (r_limit != HA_POS_ERROR) { writer->add_member("r_limit"); if (r_limit == 0) writer->add_str(varied_str); else - writer->add_ll(rint(r_limit/r_loops)); + writer->add_ll(rint(r_limit/get_r_loops())); } writer->add_member("r_used_priority_queue"); - if (r_used_pq == r_loops) + if (r_used_pq == get_r_loops()) writer->add_bool(true); else if (r_used_pq == 0) writer->add_bool(false); else writer->add_str(varied_str); - writer->add_member("r_output_rows").add_ll(rint(r_output_rows / r_loops)); + writer->add_member("r_output_rows").add_ll(rint(r_output_rows / + get_r_loops())); if (sort_passes) - writer->add_member("r_sort_passes").add_ll(rint(sort_passes / r_loops)); + { + writer->add_member("r_sort_passes").add_ll(rint(sort_passes / + get_r_loops())); + } if (sort_buffer_size != 0) { @@ -79,13 +88,13 @@ Filesort_tracker *Sort_and_group_tracker::report_sorting(THD *thd) varied_executions= true; cur_action++; if (!dummy_fsort_tracker) - dummy_fsort_tracker= new (thd->mem_root) Filesort_tracker(); + dummy_fsort_tracker= new (thd->mem_root) Filesort_tracker(is_analyze); return dummy_fsort_tracker; } return qep_actions_data[cur_action++].filesort_tracker; } - Filesort_tracker *fs_tracker= new(thd->mem_root)Filesort_tracker(); + Filesort_tracker *fs_tracker= new(thd->mem_root)Filesort_tracker(is_analyze); qep_actions_data[cur_action].filesort_tracker= fs_tracker; qep_actions[cur_action++]= EXPL_ACTION_FILESORT; diff --git a/sql/sql_analyze_stmt.h b/sql/sql_analyze_stmt.h index 203948813b1..bf800fd1df6 100644 --- a/sql/sql_analyze_stmt.h +++ b/sql/sql_analyze_stmt.h @@ -63,8 +63,8 @@ public: } // interface for getting the time - ulonglong get_loops() { return count; } - double get_time_ms() + ulonglong get_loops() const { return count; } + double get_time_ms() const { // convert 'cycles' to milliseconds. return 1000 * ((double)cycles) / sys_timer_info.cycles.frequency; @@ -169,8 +169,8 @@ class Json_writer; class Filesort_tracker : public Sql_alloc { public: - Filesort_tracker() : - r_loops(0), r_limit(0), r_used_pq(0), + Filesort_tracker(bool do_timing) : + 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) @@ -180,10 +180,12 @@ public: inline void report_use(ha_rows r_limit_arg) { - if (!r_loops++) + if (!time_tracker.get_loops()) r_limit= r_limit_arg; else r_limit= (r_limit != r_limit_arg)? 0: r_limit_arg; + + ANALYZE_START_TRACKING(&time_tracker); } inline void incr_pq_used() { r_used_pq++; } @@ -202,6 +204,7 @@ public: } inline void report_merge_passes_at_end(ulong passes) { + ANALYZE_STOP_TRACKING(&time_tracker); sort_passes += passes; } @@ -216,14 +219,14 @@ public: /* Functions to get the statistics */ void print_json_members(Json_writer *writer); - ulonglong get_r_loops() { return r_loops; } + ulonglong get_r_loops() const { return time_tracker.get_loops(); } double get_avg_examined_rows() { - return ((double)r_examined_rows) / r_loops; + return ((double)r_examined_rows) / get_r_loops(); } double get_avg_returned_rows() { - return ((double)r_output_rows) / r_loops; + return ((double)r_output_rows) / get_r_loops(); } double get_r_filtered() { @@ -233,7 +236,9 @@ public: return 1.0; } private: - ulonglong r_loops; /* How many times filesort was invoked */ + Time_and_counter_tracker time_tracker; + + //ulonglong r_loops; /* How many times filesort was invoked */ /* LIMIT is typically a constant. There is never "LIMIT 0". HA_POS_ERROR means we never had a limit @@ -366,11 +371,12 @@ class Sort_and_group_tracker : public Sql_alloc qep_actions_data[MAX_QEP_ACTIONS]; Filesort_tracker *dummy_fsort_tracker; - + bool is_analyze; public: - Sort_and_group_tracker() : + Sort_and_group_tracker(bool is_analyze_arg) : cur_action(0), total_actions(0), varied_executions(false), - dummy_fsort_tracker(NULL) + dummy_fsort_tracker(NULL), + is_analyze(is_analyze_arg) {} /*************** Reporting interface ***************/ diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 9eeddd30849..813dd075738 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -159,7 +159,7 @@ void Update_plan::save_explain_data_intern(MEM_ROOT *mem_root, explain->where_cond= select? select->cond: NULL; if (using_filesort) - explain->filesort_tracker= new (mem_root) Filesort_tracker; + explain->filesort_tracker= new (mem_root) Filesort_tracker(is_analyze); explain->using_io_buffer= using_io_buffer; append_possible_keys(mem_root, explain->possible_keys, table, diff --git a/sql/sql_explain.h b/sql/sql_explain.h index 1b6a1be5649..f92a57627d5 100644 --- a/sql/sql_explain.h +++ b/sql/sql_explain.h @@ -210,7 +210,8 @@ public: Explain_basic_join(root), message(NULL), using_temporary(false), using_filesort(false), - time_tracker(is_analyze) + time_tracker(is_analyze), + ops_tracker(is_analyze) {} /* @@ -729,6 +730,8 @@ private: This is similar to Explain_table_access, except that it is more restrictive. Also, it can have UPDATE operation options, but currently there aren't any. + + Explain_delete inherits from this. */ class Explain_update : public Explain_node diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 512c5a355c5..a62c993ecfd 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -9374,7 +9374,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, tables.db= from->s->db.str; THD_STAGE_INFO(thd, stage_sorting); - Filesort_tracker dummy_tracker; + Filesort_tracker dummy_tracker(false); if (thd->lex->select_lex.setup_ref_array(thd, order_num) || setup_order(thd, thd->lex->select_lex.ref_pointer_array, &tables, fields, all_fields, order) || |