Commit fb30a203 authored by vasil's avatar vasil

branches/innodb+:

Fix Bug#25640:

Introduce an user visible parameter innodb_stats_sample (default 8,
min 1, max 1000) and use that parameter instead of the
BTR_KEY_VAL_ESTIMATE_N_PAGES macro. Remove this macro.

Approved by:	Heikki
parent 5ad9e41b
...@@ -55,10 +55,6 @@ can be released by page reorganize, then it is reorganized */ ...@@ -55,10 +55,6 @@ can be released by page reorganize, then it is reorganized */
#define BTR_CUR_PAGE_REORGANIZE_LIMIT (UNIV_PAGE_SIZE / 32) #define BTR_CUR_PAGE_REORGANIZE_LIMIT (UNIV_PAGE_SIZE / 32)
/* When estimating number of different key values in an index, sample
this many index pages */
#define BTR_KEY_VAL_ESTIMATE_N_PAGES 8
/* The structure of a BLOB part header */ /* The structure of a BLOB part header */
/*--------------------------------------*/ /*--------------------------------------*/
#define BTR_BLOB_HDR_PART_LEN 0 /* BLOB part len on this #define BTR_BLOB_HDR_PART_LEN 0 /* BLOB part len on this
...@@ -3174,7 +3170,7 @@ btr_estimate_number_of_different_key_vals( ...@@ -3174,7 +3170,7 @@ btr_estimate_number_of_different_key_vals(
/* We sample some pages in the index to get an estimate */ /* We sample some pages in the index to get an estimate */
for (i = 0; i < BTR_KEY_VAL_ESTIMATE_N_PAGES; i++) { for (i = 0; i < srv_stats_sample; i++) {
rec_t* supremum; rec_t* supremum;
mtr_start(&mtr); mtr_start(&mtr);
...@@ -3263,7 +3259,7 @@ btr_estimate_number_of_different_key_vals( ...@@ -3263,7 +3259,7 @@ btr_estimate_number_of_different_key_vals(
} }
/* If we saw k borders between different key values on /* If we saw k borders between different key values on
BTR_KEY_VAL_ESTIMATE_N_PAGES leaf pages, we can estimate how many srv_stats_sample leaf pages, we can estimate how many
there will be in index->stat_n_leaf_pages */ there will be in index->stat_n_leaf_pages */
/* We must take into account that our sample actually represents /* We must take into account that our sample actually represents
...@@ -3274,26 +3270,26 @@ btr_estimate_number_of_different_key_vals( ...@@ -3274,26 +3270,26 @@ btr_estimate_number_of_different_key_vals(
index->stat_n_diff_key_vals[j] index->stat_n_diff_key_vals[j]
= ((n_diff[j] = ((n_diff[j]
* (ib_longlong)index->stat_n_leaf_pages * (ib_longlong)index->stat_n_leaf_pages
+ BTR_KEY_VAL_ESTIMATE_N_PAGES - 1 + srv_stats_sample - 1
+ total_external_size + total_external_size
+ not_empty_flag) + not_empty_flag)
/ (BTR_KEY_VAL_ESTIMATE_N_PAGES / (srv_stats_sample
+ total_external_size)); + total_external_size));
/* If the tree is small, smaller than /* If the tree is small, smaller than
10 * BTR_KEY_VAL_ESTIMATE_N_PAGES + total_external_size, then 10 * srv_stats_sample + total_external_size, then
the above estimate is ok. For bigger trees it is common that we the above estimate is ok. For bigger trees it is common that we
do not see any borders between key values in the few pages do not see any borders between key values in the few pages
we pick. But still there may be BTR_KEY_VAL_ESTIMATE_N_PAGES we pick. But still there may be srv_stats_sample
different key values, or even more. Let us try to approximate different key values, or even more. Let us try to approximate
that: */ that: */
add_on = index->stat_n_leaf_pages add_on = index->stat_n_leaf_pages
/ (10 * (BTR_KEY_VAL_ESTIMATE_N_PAGES / (10 * (srv_stats_sample
+ total_external_size)); + total_external_size));
if (add_on > BTR_KEY_VAL_ESTIMATE_N_PAGES) { if (add_on > srv_stats_sample) {
add_on = BTR_KEY_VAL_ESTIMATE_N_PAGES; add_on = srv_stats_sample;
} }
index->stat_n_diff_key_vals[j] += add_on; index->stat_n_diff_key_vals[j] += add_on;
......
...@@ -8420,6 +8420,12 @@ static MYSQL_SYSVAR_LONG(open_files, innobase_open_files, ...@@ -8420,6 +8420,12 @@ static MYSQL_SYSVAR_LONG(open_files, innobase_open_files,
"How many files at the maximum InnoDB keeps open at the same time.", "How many files at the maximum InnoDB keeps open at the same time.",
NULL, NULL, 300L, 10L, ~0L, 0); NULL, NULL, 300L, 10L, ~0L, 0);
static MYSQL_SYSVAR_ULONG(stats_sample, srv_stats_sample,
PLUGIN_VAR_OPCMDARG,
"When estimating number of different key values in an index, sample "
"this many index pages",
NULL, NULL, SRV_STATS_SAMPLE_DEFAULT, 1, 1000, 0);
static MYSQL_SYSVAR_ULONG(sync_spin_loops, srv_n_spin_wait_rounds, static MYSQL_SYSVAR_ULONG(sync_spin_loops, srv_n_spin_wait_rounds,
PLUGIN_VAR_RQCMDARG, PLUGIN_VAR_RQCMDARG,
"Count of spin-loop rounds in InnoDB mutexes", "Count of spin-loop rounds in InnoDB mutexes",
...@@ -8486,6 +8492,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { ...@@ -8486,6 +8492,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(stats_on_metadata), MYSQL_SYSVAR(stats_on_metadata),
MYSQL_SYSVAR(adaptive_hash_index), MYSQL_SYSVAR(adaptive_hash_index),
MYSQL_SYSVAR(replication_delay), MYSQL_SYSVAR(replication_delay),
MYSQL_SYSVAR(stats_sample),
MYSQL_SYSVAR(status_file), MYSQL_SYSVAR(status_file),
MYSQL_SYSVAR(support_xa), MYSQL_SYSVAR(support_xa),
MYSQL_SYSVAR(sync_spin_loops), MYSQL_SYSVAR(sync_spin_loops),
......
...@@ -128,6 +128,11 @@ extern ibool srv_innodb_status; ...@@ -128,6 +128,11 @@ extern ibool srv_innodb_status;
extern ibool srv_stats_on_metadata; extern ibool srv_stats_on_metadata;
/* When estimating number of different key values in an index, sample
this many index pages */
#define SRV_STATS_SAMPLE_DEFAULT 8
extern ulong srv_stats_sample;
extern ibool srv_use_doublewrite_buf; extern ibool srv_use_doublewrite_buf;
extern ibool srv_use_checksums; extern ibool srv_use_checksums;
......
...@@ -291,6 +291,10 @@ UNIV_INTERN ibool srv_innodb_status = FALSE; ...@@ -291,6 +291,10 @@ UNIV_INTERN ibool srv_innodb_status = FALSE;
UNIV_INTERN ibool srv_stats_on_metadata = TRUE; UNIV_INTERN ibool srv_stats_on_metadata = TRUE;
/* When estimating number of different key values in an index, sample
this many index pages */
UNIV_INTERN ulong srv_stats_sample = SRV_STATS_SAMPLE_DEFAULT;
UNIV_INTERN ibool srv_use_doublewrite_buf = TRUE; UNIV_INTERN ibool srv_use_doublewrite_buf = TRUE;
UNIV_INTERN ibool srv_use_checksums = TRUE; UNIV_INTERN ibool srv_use_checksums = TRUE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment