diff options
Diffstat (limited to 'sql/filesort_utils.cc')
-rw-r--r-- | sql/filesort_utils.cc | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/sql/filesort_utils.cc b/sql/filesort_utils.cc index 854033cc8d8..1aa17deb16e 100644 --- a/sql/filesort_utils.cc +++ b/sql/filesort_utils.cc @@ -19,7 +19,7 @@ #include "sql_const.h" #include "sql_sort.h" #include "table.h" - +#include "optimizer_defaults.h" PSI_memory_key key_memory_Filesort_buffer_sort_keys; @@ -58,7 +58,6 @@ const LEX_CSTRING filesort_names[]= Cost of the operation. */ -static double get_qsort_sort_cost(ha_rows num_rows, bool with_addon_fields) { const double row_copy_cost= with_addon_fields ? DEFAULT_ROW_COPY_COST : @@ -106,12 +105,13 @@ double get_pq_sort_cost(size_t num_rows, size_t queue_size, static double get_merge_cost(ha_rows num_elements, ha_rows num_buffers, - size_t elem_size, double compare_cost) + size_t elem_size, double compare_cost, + double disk_read_cost) { /* 2 -> 1 read + 1 write */ const double io_cost= (2.0 * (num_elements * elem_size + DISK_CHUNK_SIZE - 1) / - DISK_CHUNK_SIZE); + DISK_CHUNK_SIZE) * disk_read_cost; /* 2 -> 1 insert, 1 pop for the priority queue used to merge the buffers. */ const double cpu_cost= (2.0 * num_elements * log2(1.0 + num_buffers) * compare_cost) * PQ_SORT_SLOWNESS_CORRECTION_FACTOR; @@ -131,6 +131,7 @@ double get_merge_many_buffs_cost_fast(ha_rows num_rows, ha_rows num_keys_per_buffer, size_t elem_size, double key_compare_cost, + double disk_read_cost, bool with_addon_fields) { DBUG_ASSERT(num_keys_per_buffer != 0); @@ -162,7 +163,7 @@ double get_merge_many_buffs_cost_fast(ha_rows num_rows, total_cost+= num_merge_calls * get_merge_cost(num_keys_per_buffer * MERGEBUFF, MERGEBUFF, elem_size, - key_compare_cost); + key_compare_cost, disk_read_cost); // # of records in remaining buffers. last_n_elems+= num_remaining_buffs * num_keys_per_buffer; @@ -170,7 +171,7 @@ double get_merge_many_buffs_cost_fast(ha_rows num_rows, // Cost of merge sort of remaining buffers. total_cost+= get_merge_cost(last_n_elems, 1 + num_remaining_buffs, elem_size, - key_compare_cost); + key_compare_cost, disk_read_cost); num_buffers= num_merge_calls; num_keys_per_buffer*= MERGEBUFF; @@ -179,7 +180,7 @@ double get_merge_many_buffs_cost_fast(ha_rows num_rows, // Simulate final merge_buff call. last_n_elems+= num_keys_per_buffer * num_buffers; total_cost+= get_merge_cost(last_n_elems, 1 + num_buffers, elem_size, - key_compare_cost); + key_compare_cost, disk_read_cost); return total_cost; } @@ -238,7 +239,7 @@ void Sort_costs::compute_pq_sort_costs(Sort_param *param, ha_rows num_rows, { costs[PQ_SORT_ORDER_BY_FIELDS]= get_pq_sort_cost(num_rows, queue_size, false) + - param->sort_form->file->ha_rnd_pos_time(MY_MIN(queue_size - 1, num_rows)); + param->sort_form->file->ha_rnd_pos_call_time(MY_MIN(queue_size - 1, num_rows)); } /* Calculate cost with addon fields */ @@ -272,9 +273,10 @@ void Sort_costs::compute_merge_sort_costs(Sort_param *param, costs[MERGE_SORT_ORDER_BY_FIELDS]= get_merge_many_buffs_cost_fast(num_rows, num_available_keys, row_length, DEFAULT_KEY_COMPARE_COST, + default_optimizer_costs.disk_read_cost, false) + - param->sort_form->file->ha_rnd_pos_time(MY_MIN(param->limit_rows, - num_rows)); + param->sort_form->file->ha_rnd_pos_call_time(MY_MIN(param->limit_rows, + num_rows)); if (with_addon_fields) { @@ -286,6 +288,7 @@ void Sort_costs::compute_merge_sort_costs(Sort_param *param, costs[MERGE_SORT_ALL_FIELDS]= get_merge_many_buffs_cost_fast(num_rows, num_available_keys, row_length, DEFAULT_KEY_COMPARE_COST, + DISK_READ_COST_THD(thd), true); } |