mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge branch '5.5' into 10.1
This commit is contained in:
@ -358,9 +358,8 @@ QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index,
|
||||
uint mrr_buf_size, MEM_ROOT *alloc);
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time,
|
||||
bool ror_scans_required);
|
||||
bool for_range_access,
|
||||
double read_time);
|
||||
static
|
||||
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
|
||||
double read_time);
|
||||
@ -2599,7 +2598,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
|
||||
/* Get best 'range' plan and prepare data for making other plans */
|
||||
if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE,
|
||||
best_read_time, FALSE)))
|
||||
best_read_time)))
|
||||
{
|
||||
best_trp= range_trp;
|
||||
best_read_time= best_trp->read_cost;
|
||||
@ -4686,7 +4685,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
double roru_index_costs;
|
||||
ha_rows roru_total_records;
|
||||
double roru_intersect_part= 1.0;
|
||||
bool only_ror_scans_required= FALSE;
|
||||
DBUG_ENTER("get_best_disjunct_quick");
|
||||
DBUG_PRINT("info", ("Full table scan cost: %g", read_time));
|
||||
|
||||
@ -4713,8 +4711,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
n_child_scans)))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
only_ror_scans_required= !optimizer_flag(param->thd,
|
||||
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION);
|
||||
/*
|
||||
Collect best 'range' scan for each of disjuncts, and, while doing so,
|
||||
analyze possibility of ROR scans. Also calculate some values needed by
|
||||
@ -4727,8 +4723,7 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
|
||||
"tree in SEL_IMERGE"););
|
||||
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
|
||||
read_time,
|
||||
only_ror_scans_required)))
|
||||
read_time)))
|
||||
{
|
||||
/*
|
||||
One of index scans in this index_merge is more expensive than entire
|
||||
@ -5048,9 +5043,12 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge,
|
||||
a random order
|
||||
2. the functions that estimate the cost of a range scan and an
|
||||
index merge retrievals are not well calibrated
|
||||
|
||||
As the best range access has been already chosen it does not
|
||||
make sense to evaluate the one obtained from a degenerated
|
||||
index merge.
|
||||
*/
|
||||
trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE,
|
||||
read_time, FALSE);
|
||||
trp= 0;
|
||||
}
|
||||
|
||||
DBUG_RETURN(trp);
|
||||
@ -6777,9 +6775,9 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
tree make range select for this SEL_TREE
|
||||
index_read_must_be_used if TRUE, assume 'index only' option will be set
|
||||
(except for clustered PK indexes)
|
||||
for_range_access if TRUE the function is called to get the best range
|
||||
plan for range access, not for index merge access
|
||||
read_time don't create read plans with cost > read_time.
|
||||
only_ror_scans_required set to TRUE when we are only interested
|
||||
in ROR scan
|
||||
RETURN
|
||||
Best range read plan
|
||||
NULL if no plan found or error occurred
|
||||
@ -6787,9 +6785,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time,
|
||||
bool only_ror_scans_required)
|
||||
bool for_range_access,
|
||||
double read_time)
|
||||
{
|
||||
uint idx, best_idx;
|
||||
SEL_ARG *key_to_read= NULL;
|
||||
@ -6834,10 +6831,11 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
(bool) param->table->covering_keys.is_set(keynr);
|
||||
|
||||
found_records= check_quick_select(param, idx, read_index_only, key,
|
||||
update_tbl_stats, &mrr_flags,
|
||||
for_range_access, &mrr_flags,
|
||||
&buf_size, &cost);
|
||||
|
||||
if (only_ror_scans_required && !param->is_ror_scan)
|
||||
if (!for_range_access && !param->is_ror_scan &&
|
||||
!optimizer_flag(param->thd,OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION))
|
||||
{
|
||||
/* The scan is not a ROR-scan, just skip it */
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user