diff options
author | Monty <monty@mariadb.org> | 2022-04-05 20:12:29 +0300 |
---|---|---|
committer | Sergei Petrunia <sergey@mariadb.com> | 2023-02-02 21:44:00 +0300 |
commit | 5e651c9aea1234c7ee83c38761af251872960335 (patch) | |
tree | 029f20adfa664e0d6a749f71dd4d5e048456a0f6 /sql/filesort_utils.cc | |
parent | b6215b9b20b55911ca06c4cee1fa6ebdd4e8e1eb (diff) | |
download | mariadb-git-5e651c9aea1234c7ee83c38761af251872960335.tar.gz |
Make the most important optimizer constants user variables
Variables added:
- optimizer_index_block_copy_cost
- optimizer_key_copy_cost
- optimizer_key_next_find_cost
- optimizer_key_compare_cost
- optimizer_row_copy_cost
- optimizer_where_compare_cost
Some rename of defines was done to make the internal defines similar to
the visible ones:
TIME_FOR_COMPARE -> WHERE_COST; WHERE_COST was also "inverted" to be
a number between 0 and 1 that is multiply with accepted records
(similar to other optimizer variables).
TIME_FOR_COMPARE_IDX -> KEY_COMPARE_COST. This is also inverted,
similar to TIME_FOR_COMPARE.
TIME_FOR_COMPARE_ROWID -> ROWID_COMPARE_COST. This is also inverted,
similar to TIME_FOR_COMPARE.
All default costs are identical to what they where before this patch.
Other things:
- Compare factor in get_merge_buffers_cost() was inverted.
- Changed namespace to static in filesort_utils.cc
Diffstat (limited to 'sql/filesort_utils.cc')
-rw-r--r-- | sql/filesort_utils.cc | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/sql/filesort_utils.cc b/sql/filesort_utils.cc index 341e43ea6cf..6790016c838 100644 --- a/sql/filesort_utils.cc +++ b/sql/filesort_utils.cc @@ -23,17 +23,16 @@ PSI_memory_key key_memory_Filesort_buffer_sort_keys; -namespace { /** A local helper function. See comments for get_merge_buffers_cost(). - */ -double get_merge_cost(ha_rows num_elements, ha_rows num_buffers, uint elem_size) +*/ + +static double get_merge_cost(double rowid_compare_cost, ha_rows num_elements, + ha_rows num_buffers, uint elem_size) { - return - 2.0 * ((double) num_elements * elem_size) / IO_SIZE - + (double) num_elements * log((double) num_buffers) / - (TIME_FOR_COMPARE_ROWID * M_LN2); -} + return (2.0 * ((double) num_elements * elem_size) / IO_SIZE + + (double) num_elements * log((double) num_buffers) * + rowid_compare_cost / M_LN2); } /** @@ -43,20 +42,21 @@ double get_merge_cost(ha_rows num_elements, ha_rows num_buffers, uint elem_size) see comments for get_merge_buffers_cost(). TODO: Use this function for Unique::get_use_cost(). */ -double get_merge_many_buffs_cost_fast(ha_rows num_rows, + +double get_merge_many_buffs_cost_fast(THD *thd, + ha_rows num_rows, ha_rows num_keys_per_buffer, uint elem_size) { ha_rows num_buffers= num_rows / num_keys_per_buffer; ha_rows last_n_elems= num_rows % num_keys_per_buffer; - double total_cost; + double total_cost, rowid_compare_cost= ROWID_COMPARE_COST_THD(thd); // Calculate CPU cost of sorting buffers. total_cost= ((num_buffers * num_keys_per_buffer * log(1.0 + num_keys_per_buffer) + - last_n_elems * log(1.0 + last_n_elems)) / - TIME_FOR_COMPARE_ROWID); - + last_n_elems * log(1.0 + last_n_elems)) * rowid_compare_cost); + // Simulate behavior of merge_many_buff(). while (num_buffers >= MERGEBUFF2) { @@ -69,14 +69,16 @@ double get_merge_many_buffs_cost_fast(ha_rows num_rows, // Cost of merge sort 'num_merge_calls'. total_cost+= num_merge_calls * - get_merge_cost(num_keys_per_buffer * MERGEBUFF, MERGEBUFF, elem_size); + get_merge_cost(rowid_compare_cost, num_keys_per_buffer * MERGEBUFF, + MERGEBUFF, elem_size); // # of records in remaining buffers. last_n_elems+= num_remaining_buffs * num_keys_per_buffer; // Cost of merge sort of remaining buffers. total_cost+= - get_merge_cost(last_n_elems, 1 + num_remaining_buffs, elem_size); + get_merge_cost(rowid_compare_cost, last_n_elems, 1 + num_remaining_buffs, + elem_size); num_buffers= num_merge_calls; num_keys_per_buffer*= MERGEBUFF; @@ -84,7 +86,8 @@ 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); + total_cost+= get_merge_cost(rowid_compare_cost, last_n_elems, 1 + num_buffers, + elem_size); return total_cost; } |