mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge mysql.com:/usr/local/bk/mysql-5.0
into mysql.com:/home/pem/work/mysql-5.0
This commit is contained in:
@@ -108,15 +108,15 @@ insert into t7 values (18,2,3,4,5,6);
|
||||
insert into t7 values (19,2,3,4,5,6);
|
||||
insert into t7 values (20,2,3,4,5,6);
|
||||
insert into t7 values (21,2,3,4,5,6);
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
62
|
||||
select @@heuristic;
|
||||
@@heuristic
|
||||
select @@optimizer_prune_level;
|
||||
@@optimizer_prune_level
|
||||
1
|
||||
set plan_search_depth=63;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=63;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
63
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -190,13 +190,13 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 794.838037
|
||||
set heuristic=0;
|
||||
select @@heuristic;
|
||||
@@heuristic
|
||||
set optimizer_prune_level=0;
|
||||
select @@optimizer_prune_level;
|
||||
@@optimizer_prune_level
|
||||
0
|
||||
set plan_search_depth=0;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=0;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
0
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -270,9 +270,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 274.419727
|
||||
set plan_search_depth=1;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=1;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
1
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -346,9 +346,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 794.838037
|
||||
set plan_search_depth=62;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=62;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
62
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -422,13 +422,13 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 274.419727
|
||||
set heuristic=1;
|
||||
select @@heuristic;
|
||||
@@heuristic
|
||||
set optimizer_prune_level=1;
|
||||
select @@optimizer_prune_level;
|
||||
@@optimizer_prune_level
|
||||
1
|
||||
set plan_search_depth=0;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=0;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
0
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -502,9 +502,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 794.838037
|
||||
set plan_search_depth=1;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=1;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
1
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
@@ -578,9 +578,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
show status like 'Last_query_cost';
|
||||
Variable_name Value
|
||||
Last_query_cost 794.838037
|
||||
set plan_search_depth=62;
|
||||
select @@plan_search_depth;
|
||||
@@plan_search_depth
|
||||
set optimizer_search_depth=62;
|
||||
select @@optimizer_search_depth;
|
||||
@@optimizer_search_depth
|
||||
62
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
|
@@ -137,21 +137,21 @@ insert into t7 values (21,2,3,4,5,6);
|
||||
|
||||
# Check the default values for the optimizer paramters
|
||||
|
||||
select @@plan_search_depth;
|
||||
select @@heuristic;
|
||||
select @@optimizer_search_depth;
|
||||
select @@optimizer_prune_level;
|
||||
|
||||
-- This value swithes back to the old implementation of 'find_best()'
|
||||
-- set plan_search_depth=63; - old (independent of the heuristic)
|
||||
-- set optimizer_search_depth=63; - old (independent of the optimizer_prune_level)
|
||||
--
|
||||
-- These are the values for the parameters that control the greedy optimizer
|
||||
-- (total 6 combinations - 3 for plan_search_depth, 2 for heuristic):
|
||||
-- (total 6 combinations - 3 for optimizer_search_depth, 2 for optimizer_prune_level):
|
||||
--
|
||||
-- set plan_search_depth=0; - automatic
|
||||
-- set plan_search_depth=1; - min
|
||||
-- set plan_search_depth=62; - max (default)
|
||||
-- set optimizer_search_depth=0; - automatic
|
||||
-- set optimizer_search_depth=1; - min
|
||||
-- set optimizer_search_depth=62; - max (default)
|
||||
--
|
||||
-- set heuristic=0 - exhaustive;
|
||||
-- set heuristic=1 - heuristic; -- default
|
||||
-- set optimizer_prune_level=0 - exhaustive;
|
||||
-- set optimizer_prune_level=1 - heuristic; -- default
|
||||
|
||||
|
||||
#
|
||||
@@ -167,8 +167,8 @@ select @@heuristic;
|
||||
# procedure 'find_best'. Notice that 'find_best' does not depend on the
|
||||
# choice of heuristic.
|
||||
|
||||
set plan_search_depth=63;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=63;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -189,11 +189,11 @@ show status like 'Last_query_cost';
|
||||
|
||||
# Test the new optimization procedures
|
||||
|
||||
set heuristic=0;
|
||||
select @@heuristic;
|
||||
set optimizer_prune_level=0;
|
||||
select @@optimizer_prune_level;
|
||||
|
||||
set plan_search_depth=0;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=0;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -211,8 +211,8 @@ show status like 'Last_query_cost';
|
||||
explain select t1.c11 from t7, t6, t5, t4, t3, t2, t1 where t1.c11 = t2.c21 and t1.c12 = t3.c31 and t1.c13 = t4.c41 and t1.c14 = t5.c51 and t1.c15 = t6.c61 and t1.c16 = t7.c71 and t2.c22 = t3.c32 and t2.c23 = t4.c42 and t2.c24 = t5.c52 and t2.c25 = t6.c62 and t2.c26 = t7.c72 and t3.c33 = t4.c43 and t3.c34 = t5.c53 and t3.c35 = t6.c63 and t3.c36 = t7.c73 and t4.c42 = t5.c54 and t4.c43 = t6.c64 and t4.c44 = t7.c74 and t5.c52 = t6.c65 and t5.c53 = t7.c75 and t6.c62 = t7.c76;
|
||||
show status like 'Last_query_cost';
|
||||
|
||||
set plan_search_depth=1;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=1;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -230,8 +230,8 @@ show status like 'Last_query_cost';
|
||||
explain select t1.c11 from t7, t6, t5, t4, t3, t2, t1 where t1.c11 = t2.c21 and t1.c12 = t3.c31 and t1.c13 = t4.c41 and t1.c14 = t5.c51 and t1.c15 = t6.c61 and t1.c16 = t7.c71 and t2.c22 = t3.c32 and t2.c23 = t4.c42 and t2.c24 = t5.c52 and t2.c25 = t6.c62 and t2.c26 = t7.c72 and t3.c33 = t4.c43 and t3.c34 = t5.c53 and t3.c35 = t6.c63 and t3.c36 = t7.c73 and t4.c42 = t5.c54 and t4.c43 = t6.c64 and t4.c44 = t7.c74 and t5.c52 = t6.c65 and t5.c53 = t7.c75 and t6.c62 = t7.c76;
|
||||
show status like 'Last_query_cost';
|
||||
|
||||
set plan_search_depth=62;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=62;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -250,11 +250,11 @@ explain select t1.c11 from t7, t6, t5, t4, t3, t2, t1 where t1.c11 = t2.c21 and
|
||||
show status like 'Last_query_cost';
|
||||
|
||||
|
||||
set heuristic=1;
|
||||
select @@heuristic;
|
||||
set optimizer_prune_level=1;
|
||||
select @@optimizer_prune_level;
|
||||
|
||||
set plan_search_depth=0;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=0;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -272,8 +272,8 @@ show status like 'Last_query_cost';
|
||||
explain select t1.c11 from t7, t6, t5, t4, t3, t2, t1 where t1.c11 = t2.c21 and t1.c12 = t3.c31 and t1.c13 = t4.c41 and t1.c14 = t5.c51 and t1.c15 = t6.c61 and t1.c16 = t7.c71 and t2.c22 = t3.c32 and t2.c23 = t4.c42 and t2.c24 = t5.c52 and t2.c25 = t6.c62 and t2.c26 = t7.c72 and t3.c33 = t4.c43 and t3.c34 = t5.c53 and t3.c35 = t6.c63 and t3.c36 = t7.c73 and t4.c42 = t5.c54 and t4.c43 = t6.c64 and t4.c44 = t7.c74 and t5.c52 = t6.c65 and t5.c53 = t7.c75 and t6.c62 = t7.c76;
|
||||
show status like 'Last_query_cost';
|
||||
|
||||
set plan_search_depth=1;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=1;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
@@ -291,8 +291,8 @@ show status like 'Last_query_cost';
|
||||
explain select t1.c11 from t7, t6, t5, t4, t3, t2, t1 where t1.c11 = t2.c21 and t1.c12 = t3.c31 and t1.c13 = t4.c41 and t1.c14 = t5.c51 and t1.c15 = t6.c61 and t1.c16 = t7.c71 and t2.c22 = t3.c32 and t2.c23 = t4.c42 and t2.c24 = t5.c52 and t2.c25 = t6.c62 and t2.c26 = t7.c72 and t3.c33 = t4.c43 and t3.c34 = t5.c53 and t3.c35 = t6.c63 and t3.c36 = t7.c73 and t4.c42 = t5.c54 and t4.c43 = t6.c64 and t4.c44 = t7.c74 and t5.c52 = t6.c65 and t5.c53 = t7.c75 and t6.c62 = t7.c76;
|
||||
show status like 'Last_query_cost';
|
||||
|
||||
set plan_search_depth=62;
|
||||
select @@plan_search_depth;
|
||||
set optimizer_search_depth=62;
|
||||
select @@optimizer_search_depth;
|
||||
|
||||
-- 6-table join, chain
|
||||
explain select t1.c11 from t1, t2, t3, t4, t5, t6, t7 where t1.c12 = t2.c21 and t2.c22 = t3.c31 and t3.c32 = t4.c41 and t4.c42 = t5.c51 and t5.c52 = t6.c61 and t6.c62 = t7.c71;
|
||||
|
@@ -3777,8 +3777,8 @@ enum options_mysqld
|
||||
OPT_TIME_FORMAT,
|
||||
OPT_DATETIME_FORMAT,
|
||||
OPT_LOG_QUERIES_NOT_USING_INDEXES,
|
||||
OPT_PLAN_SEARCH_DEPTH,
|
||||
OPT_HEURISTIC
|
||||
OPT_OPTIMIZER_SEARCH_DEPTH,
|
||||
OPT_OPTIMIZER_PRUNE_LEVEL
|
||||
};
|
||||
|
||||
|
||||
@@ -4403,11 +4403,6 @@ log and this option does nothing anymore.",
|
||||
"Use stopwords from this file instead of built-in list.",
|
||||
(gptr*) &ft_stopword_file, (gptr*) &ft_stopword_file, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"heuristic", OPT_HEURISTIC,
|
||||
"Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on rows and read time.",
|
||||
(gptr*) &global_system_variables.heuristic,
|
||||
(gptr*) &max_system_variables.heuristic,
|
||||
0, GET_ULONG, OPT_ARG, 1, 0, 1, 0, 1, 0},
|
||||
#ifdef HAVE_INNOBASE_DB
|
||||
{"innodb_mirrored_log_groups", OPT_INNODB_MIRRORED_LOG_GROUPS,
|
||||
"Number of identical copies of log groups we keep for the database. Currently this should be set to 1.",
|
||||
@@ -4648,10 +4643,15 @@ The minimum value for this variable is 4096.",
|
||||
"If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of files.",
|
||||
(gptr*) &open_files_limit, (gptr*) &open_files_limit, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 0, 0, OS_FILE_LIMIT, 0, 1, 0},
|
||||
{"plan_search_depth", OPT_PLAN_SEARCH_DEPTH,
|
||||
{"optimizer_prune_level", OPT_OPTIMIZER_PRUNE_LEVEL,
|
||||
"Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows.",
|
||||
(gptr*) &global_system_variables.optimizer_prune_level,
|
||||
(gptr*) &max_system_variables.optimizer_prune_level,
|
||||
0, GET_ULONG, OPT_ARG, 1, 0, 1, 0, 1, 0},
|
||||
{"optimizer_search_depth", OPT_OPTIMIZER_SEARCH_DEPTH,
|
||||
"Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Smaller values than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value; if set to MAX_TABLES+2, the optimizer will switch to the original find_best (used for testing/comparison).",
|
||||
(gptr*) &global_system_variables.plan_search_depth,
|
||||
(gptr*) &max_system_variables.plan_search_depth,
|
||||
(gptr*) &global_system_variables.optimizer_search_depth,
|
||||
(gptr*) &max_system_variables.optimizer_search_depth,
|
||||
0, GET_ULONG, OPT_ARG, MAX_TABLES+1, 0, MAX_TABLES+2, 0, 1, 0},
|
||||
{"preload_buffer_size", OPT_PRELOAD_BUFFER_SIZE,
|
||||
"The size of the buffer that is allocated when preloading indexes",
|
||||
|
@@ -50,27 +50,27 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s)
|
||||
*/
|
||||
switch(*ptr) {
|
||||
case '\\': // escape character
|
||||
if (my_b_write(file, "\\\\", 2))
|
||||
if (my_b_append(file, "\\\\", 2))
|
||||
return TRUE;
|
||||
break;
|
||||
case '\n': // parameter value delimiter
|
||||
if (my_b_write(file, "\\n", 2))
|
||||
if (my_b_append(file, "\\n", 2))
|
||||
return TRUE;
|
||||
break;
|
||||
case '\0': // problem for some string processing utilites
|
||||
if (my_b_write(file, "\\0", 2))
|
||||
if (my_b_append(file, "\\0", 2))
|
||||
return TRUE;
|
||||
break;
|
||||
case 26: // problem for windows utilites (Ctrl-Z)
|
||||
if (my_b_write(file, "\\z", 2))
|
||||
if (my_b_append(file, "\\z", 2))
|
||||
return TRUE;
|
||||
break;
|
||||
case '\'': // list of string delimiter
|
||||
if (my_b_write(file, "\\\'", 2))
|
||||
if (my_b_append(file, "\\\'", 2))
|
||||
return TRUE;
|
||||
break;
|
||||
default:
|
||||
if (my_b_write(file, ptr, 1))
|
||||
if (my_b_append(file, ptr, 1))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -106,7 +106,7 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter,
|
||||
case FILE_OPTIONS_STRING:
|
||||
{
|
||||
LEX_STRING *val_s= (LEX_STRING *)(base + parameter->offset);
|
||||
if (my_b_write(file, val_s->str, val_s->length))
|
||||
if (my_b_append(file, val_s->str, val_s->length))
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
@@ -119,7 +119,7 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter,
|
||||
case FILE_OPTIONS_ULONGLONG:
|
||||
{
|
||||
num.set(*((ulonglong *)(base + parameter->offset)), &my_charset_bin);
|
||||
if (my_b_write(file, num.ptr(), num.length()))
|
||||
if (my_b_append(file, num.ptr(), num.length()))
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
@@ -128,7 +128,7 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter,
|
||||
ulonglong *val_i= (ulonglong *)(base + parameter->offset);
|
||||
*old_version= (*val_i)++;
|
||||
num.set(*val_i, &my_charset_bin);
|
||||
if (my_b_write(file, num.ptr(), num.length()))
|
||||
if (my_b_append(file, num.ptr(), num.length()))
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
@@ -141,7 +141,7 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter,
|
||||
get_date(val_s->str, GETDATE_DATE_TIME|GETDATE_GMT|GETDATE_FIXEDLENGTH,
|
||||
tm);
|
||||
val_s->length= PARSE_FILE_TIMESTAMPLENGTH;
|
||||
if (my_b_write(file, val_s->str, PARSE_FILE_TIMESTAMPLENGTH))
|
||||
if (my_b_append(file, val_s->str, PARSE_FILE_TIMESTAMPLENGTH))
|
||||
DBUG_RETURN(TRUE);
|
||||
break;
|
||||
}
|
||||
@@ -155,10 +155,10 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter,
|
||||
{
|
||||
num.set((ulonglong)str->length, &my_charset_bin);
|
||||
// ',' after string to detect list continuation
|
||||
if ((!first && my_b_write(file, " ", 1)) ||
|
||||
my_b_write(file, "\'", 1) ||
|
||||
my_b_write(file, str->str, str->length) ||
|
||||
my_b_write(file, "\'", 1))
|
||||
if ((!first && my_b_append(file, " ", 1)) ||
|
||||
my_b_append(file, "\'", 1) ||
|
||||
my_b_append(file, str->str, str->length) ||
|
||||
my_b_append(file, "\'", 1))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
@@ -222,18 +222,18 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
|
||||
goto err_w_file;
|
||||
|
||||
// write header (file signature)
|
||||
if (my_b_write(&file, "TYPE=", 5) ||
|
||||
my_b_write(&file, type->str, type->length) ||
|
||||
my_b_write(&file, "\n", 1))
|
||||
if (my_b_append(&file, "TYPE=", 5) ||
|
||||
my_b_append(&file, type->str, type->length) ||
|
||||
my_b_append(&file, "\n", 1))
|
||||
goto err_w_file;
|
||||
|
||||
// write parameters to temporary file
|
||||
for (File_option *param= parameters; param->name.str; param++)
|
||||
{
|
||||
if (my_b_write(&file, param->name.str, param->name.length) ||
|
||||
my_b_write(&file, "=", 1) ||
|
||||
if (my_b_append(&file, param->name.str, param->name.length) ||
|
||||
my_b_append(&file, "=", 1) ||
|
||||
write_parameter(&file, base, param, &old_version) ||
|
||||
my_b_write(&file, "\n", 1))
|
||||
my_b_append(&file, "\n", 1))
|
||||
goto err_w_cache;
|
||||
}
|
||||
|
||||
|
@@ -160,7 +160,6 @@ sys_var_str sys_ft_boolean_syntax("ft_boolean_syntax",
|
||||
sys_update_ftb_syntax,
|
||||
sys_default_ftb_syntax,
|
||||
ft_boolean_syntax);
|
||||
sys_var_thd_ulong sys_heuristic("heuristic", &SV::heuristic);
|
||||
sys_var_str sys_init_connect("init_connect", 0,
|
||||
sys_update_init_connect,
|
||||
sys_default_init_connect,0);
|
||||
@@ -263,8 +262,10 @@ sys_var_thd_ulong sys_net_retry_count("net_retry_count",
|
||||
0, fix_net_retry_count);
|
||||
sys_var_thd_bool sys_new_mode("new", &SV::new_mode);
|
||||
sys_var_thd_bool sys_old_passwords("old_passwords", &SV::old_passwords);
|
||||
sys_var_thd_ulong sys_plan_search_depth("plan_search_depth",
|
||||
&SV::plan_search_depth);
|
||||
sys_var_thd_ulong sys_optimizer_prune_level("optimizer_prune_level",
|
||||
&SV::optimizer_prune_level);
|
||||
sys_var_thd_ulong sys_optimizer_search_depth("optimizer_search_depth",
|
||||
&SV::optimizer_search_depth);
|
||||
sys_var_thd_ulong sys_preload_buff_size("preload_buffer_size",
|
||||
&SV::preload_buff_size);
|
||||
sys_var_thd_ulong sys_read_buff_size("read_buffer_size",
|
||||
@@ -491,7 +492,6 @@ sys_var *sys_variables[]=
|
||||
&sys_ft_boolean_syntax,
|
||||
&sys_foreign_key_checks,
|
||||
&sys_group_concat_max_len,
|
||||
&sys_heuristic,
|
||||
&sys_identity,
|
||||
&sys_init_connect,
|
||||
&sys_init_slave,
|
||||
@@ -540,7 +540,8 @@ sys_var *sys_variables[]=
|
||||
&sys_net_write_timeout,
|
||||
&sys_new_mode,
|
||||
&sys_old_passwords,
|
||||
&sys_plan_search_depth,
|
||||
&sys_optimizer_prune_level,
|
||||
&sys_optimizer_search_depth,
|
||||
&sys_preload_buff_size,
|
||||
&sys_pseudo_thread_id,
|
||||
&sys_query_alloc_block_size,
|
||||
@@ -750,6 +751,10 @@ struct show_var_st init_vars[]= {
|
||||
{sys_new_mode.name, (char*) &sys_new_mode, SHOW_SYS},
|
||||
{sys_old_passwords.name, (char*) &sys_old_passwords, SHOW_SYS},
|
||||
{"open_files_limit", (char*) &open_files_limit, SHOW_LONG},
|
||||
{sys_optimizer_prune_level.name, (char*) &sys_optimizer_prune_level,
|
||||
SHOW_SYS},
|
||||
{sys_optimizer_search_depth.name,(char*) &sys_optimizer_search_depth,
|
||||
SHOW_SYS},
|
||||
{"pid_file", (char*) pidfile_name, SHOW_CHAR},
|
||||
{"port", (char*) &mysqld_port, SHOW_INT},
|
||||
{sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS},
|
||||
@@ -817,8 +822,6 @@ struct show_var_st init_vars[]= {
|
||||
{"version_compile_machine", (char*) MACHINE_TYPE, SHOW_CHAR},
|
||||
{sys_os.name, (char*) &sys_os, SHOW_SYS},
|
||||
{sys_net_wait_timeout.name, (char*) &sys_net_wait_timeout, SHOW_SYS},
|
||||
{sys_heuristic.name, (char*) &sys_heuristic, SHOW_SYS},
|
||||
{sys_plan_search_depth.name,(char*) &sys_plan_search_depth, SHOW_SYS},
|
||||
{NullS, NullS, SHOW_LONG}
|
||||
};
|
||||
|
||||
|
@@ -384,6 +384,8 @@ struct system_variables
|
||||
ulong net_retry_count;
|
||||
ulong net_wait_timeout;
|
||||
ulong net_write_timeout;
|
||||
ulong optimizer_prune_level;
|
||||
ulong optimizer_search_depth;
|
||||
ulong preload_buff_size;
|
||||
ulong query_cache_type;
|
||||
ulong read_buff_size;
|
||||
@@ -392,8 +394,6 @@ struct system_variables
|
||||
ulong table_type;
|
||||
ulong tmp_table_size;
|
||||
ulong tx_isolation;
|
||||
ulong heuristic;
|
||||
ulong plan_search_depth;
|
||||
/* Determines which non-standard SQL behaviour should be enabled */
|
||||
ulong sql_mode;
|
||||
ulong default_week_format;
|
||||
|
@@ -55,12 +55,12 @@ static void best_access_path(JOIN *join, JOIN_TAB *s, THD *thd,
|
||||
double record_count, double read_time);
|
||||
static void optimize_straight_join(JOIN *join, table_map join_tables);
|
||||
static void greedy_search(JOIN *join, table_map remaining_tables,
|
||||
uint depth, uint heuristic);
|
||||
uint depth, uint prune_level);
|
||||
static void best_extension_by_limited_search(JOIN *join,
|
||||
table_map remaining_tables,
|
||||
uint idx, double record_count,
|
||||
double read_time, uint depth,
|
||||
uint heuristic);
|
||||
uint prune_level);
|
||||
static uint determine_search_depth(JOIN* join);
|
||||
static int join_tab_cmp(const void* ptr1, const void* ptr2);
|
||||
/*
|
||||
@@ -3063,8 +3063,8 @@ best_access_path(JOIN *join,
|
||||
static void
|
||||
choose_plan(JOIN *join, table_map join_tables)
|
||||
{
|
||||
uint search_depth= join->thd->variables.plan_search_depth;
|
||||
uint heuristic= join->thd->variables.heuristic;
|
||||
uint search_depth= join->thd->variables.optimizer_search_depth;
|
||||
uint prune_level= join->thd->variables.optimizer_prune_level;
|
||||
|
||||
DBUG_ENTER("choose_plan");
|
||||
|
||||
@@ -3094,7 +3094,7 @@ choose_plan(JOIN *join, table_map join_tables)
|
||||
if (search_depth == 0)
|
||||
/* Automatically determine a reasonable value for 'search_depth' */
|
||||
search_depth= determine_search_depth(join);
|
||||
greedy_search(join, join_tables, search_depth, heuristic);
|
||||
greedy_search(join, join_tables, search_depth, prune_level);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3245,7 +3245,7 @@ optimize_straight_join(JOIN *join, table_map join_tables)
|
||||
for the query
|
||||
remaining_tables set of tables not included into the partial plan yet
|
||||
search_depth controlls the exhaustiveness of the search
|
||||
heuristic the pruning heuristics that should be applied during
|
||||
prune_level the pruning heuristics that should be applied during
|
||||
search
|
||||
|
||||
DESCRIPTION
|
||||
@@ -3315,7 +3315,7 @@ static void
|
||||
greedy_search(JOIN *join,
|
||||
table_map remaining_tables,
|
||||
uint search_depth,
|
||||
uint heuristic)
|
||||
uint prune_level)
|
||||
{
|
||||
double record_count= 1.0;
|
||||
double read_time= 0.0;
|
||||
@@ -3334,7 +3334,7 @@ greedy_search(JOIN *join,
|
||||
/* Find the extension of the current QEP with the lowest cost */
|
||||
join->best_read= DBL_MAX;
|
||||
best_extension_by_limited_search(join, remaining_tables, idx, record_count,
|
||||
read_time, search_depth, heuristic);
|
||||
read_time, search_depth, prune_level);
|
||||
|
||||
if (rem_size <= search_depth)
|
||||
{
|
||||
@@ -3398,7 +3398,7 @@ greedy_search(JOIN *join,
|
||||
read_time the cost of the best partial plan
|
||||
search_depth maximum depth of the recursion and thus size of the found
|
||||
optimal plan (0 < search_depth <= join->tables+1).
|
||||
heuristic pruning heuristics that should be applied during optimization
|
||||
prune_level pruning heuristics that should be applied during optimization
|
||||
(values: 0 = EXHAUSTIVE, 1 = PRUNE_BY_TIME_OR_ROWS)
|
||||
|
||||
DESCRIPTION
|
||||
@@ -3482,7 +3482,7 @@ greedy_search(JOIN *join,
|
||||
When 'best_extension_by_limited_search' is called for the first time,
|
||||
'join->best_read' must be set to the largest possible value (e.g. DBL_MAX).
|
||||
The actual implementation provides a way to optionally use pruning
|
||||
heuristics (controlled by the parameter 'heuristic') to reduce the search
|
||||
heuristic (controlled by the parameter 'prune_level') to reduce the search
|
||||
space by skipping some partial plans.
|
||||
The parameter 'search_depth' provides control over the recursion
|
||||
depth, and thus the size of the resulting optimal plan.
|
||||
@@ -3498,7 +3498,7 @@ best_extension_by_limited_search(JOIN *join,
|
||||
double record_count,
|
||||
double read_time,
|
||||
uint search_depth,
|
||||
uint heuristic)
|
||||
uint prune_level)
|
||||
{
|
||||
THD *thd= join->thd;
|
||||
if (thd->killed) // Abort
|
||||
@@ -3543,7 +3543,7 @@ best_extension_by_limited_search(JOIN *join,
|
||||
Prune some less promising partial plans. This heuristic may miss
|
||||
the optimal QEPs, thus it results in a non-exhaustive search.
|
||||
*/
|
||||
if (heuristic == 1)
|
||||
if (prune_level == 1)
|
||||
{
|
||||
if (best_record_count > current_record_count ||
|
||||
best_read_time > current_read_time ||
|
||||
@@ -3563,7 +3563,7 @@ best_extension_by_limited_search(JOIN *join,
|
||||
else
|
||||
{
|
||||
DBUG_EXECUTE("opt", print_plan(join, read_time, record_count, idx,
|
||||
"prune_by_heuristic"););
|
||||
"pruned_by_heuristic"););
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -3577,7 +3577,7 @@ best_extension_by_limited_search(JOIN *join,
|
||||
current_record_count,
|
||||
current_read_time,
|
||||
search_depth - 1,
|
||||
heuristic);
|
||||
prune_level);
|
||||
if (thd->killed)
|
||||
DBUG_VOID_RETURN;
|
||||
swap(JOIN_TAB*, join->best_ref[idx], *pos);
|
||||
|
Reference in New Issue
Block a user