summaryrefslogtreecommitdiff
path: root/sql/filesort_utils.cc
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2022-04-05 20:12:29 +0300
committerSergei Petrunia <sergey@mariadb.com>2023-02-02 21:44:00 +0300
commit5e651c9aea1234c7ee83c38761af251872960335 (patch)
tree029f20adfa664e0d6a749f71dd4d5e048456a0f6 /sql/filesort_utils.cc
parentb6215b9b20b55911ca06c4cee1fa6ebdd4e8e1eb (diff)
downloadmariadb-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.cc35
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;
}