Commit 15cce52b authored by Monty's avatar Monty Committed by Sergei Petrunia

Added optimizer_trace info for index_intersects

parent 0fada9c2
...@@ -6388,9 +6388,19 @@ bool check_index_intersect_extension(THD *thd, ...@@ -6388,9 +6388,19 @@ bool check_index_intersect_extension(THD *thd,
COMMON_INDEX_INTERSECT_INFO *common_info= curr->common_info; COMMON_INDEX_INTERSECT_INFO *common_info= curr->common_info;
double cutoff_cost= common_info->cutoff_cost; double cutoff_cost= common_info->cutoff_cost;
uint idx= curr->length; uint idx= curr->length;
Json_writer_object trace(thd, "check_index_intersect_extension");
next->index_read_cost= curr->index_read_cost+ext_index_scan->index_read_cost; next->index_read_cost= curr->index_read_cost+ext_index_scan->index_read_cost;
if (next->index_read_cost > cutoff_cost) if (next->index_read_cost > cutoff_cost)
{
if (unlikely(trace.trace_started()))
trace.
add("index", ext_index_scan->key_info->name.str).
add("cost", next->index_read_cost).
add("chosen", false).
add("cause", "cost");
return FALSE; return FALSE;
}
if ((next->in_memory= curr->in_memory)) if ((next->in_memory= curr->in_memory))
next->in_memory_cost= curr->in_memory_cost; next->in_memory_cost= curr->in_memory_cost;
...@@ -6414,6 +6424,7 @@ bool check_index_intersect_extension(THD *thd, ...@@ -6414,6 +6424,7 @@ bool check_index_intersect_extension(THD *thd,
common_info->compare_factor)* common_info->compare_factor)*
ext_index_scan_records; ext_index_scan_records;
cost= next->in_memory_cost; cost= next->in_memory_cost;
} }
else else
{ {
...@@ -6451,6 +6462,19 @@ bool check_index_intersect_extension(THD *thd, ...@@ -6451,6 +6462,19 @@ bool check_index_intersect_extension(THD *thd,
if (next->in_memory) if (next->in_memory)
next->in_memory_cost= cost; next->in_memory_cost= cost;
} }
if (unlikely(trace.trace_started()))
{
trace.
add("index", ext_index_scan->key_info->name.str).
add("in_memory", next->in_memory).
add("range_rows", ext_index_scan_records).
add("rows_sent_to_unique", records_sent_to_unique).
add("unique_cost", cost).
add("index_read_cost", next->index_read_cost);
if (next->use_cpk_filter)
trace.add("rows_filtered_out_by_clustered_pk", records_filtered_out_by_cpk);
}
if (next->use_cpk_filter) if (next->use_cpk_filter)
{ {
...@@ -6462,20 +6486,37 @@ bool check_index_intersect_extension(THD *thd, ...@@ -6462,20 +6486,37 @@ bool check_index_intersect_extension(THD *thd,
records= records_in_index_intersect_extension(curr, ext_index_scan); records= records_in_index_intersect_extension(curr, ext_index_scan);
if (idx && records > curr->records) if (idx && records > curr->records)
{
if (unlikely(trace.trace_started()))
trace.
add("rows", records).
add("chosen", false).
add("cause", "too many rows");
return FALSE; return FALSE;
}
if (next->use_cpk_filter && curr->filtered_scans.is_clear_all()) if (next->use_cpk_filter && curr->filtered_scans.is_clear_all())
records-= records_filtered_out_by_cpk; records-= records_filtered_out_by_cpk;
next->records= records; next->records= records;
cost+= next->index_read_cost; cost+= next->index_read_cost;
if (cost >= cutoff_cost) if (cost >= cutoff_cost)
{
if (unlikely(trace.trace_started()))
trace.add("cost", cost).add("chosen", false).add("cause", "cost");
return FALSE; return FALSE;
}
/*
The cost after sweeep can be bigger than cutoff, but that is ok as the
end cost can decrease when we add the next index.
*/
cost+= get_sweep_read_cost(common_info->param, records, 1); cost+= get_sweep_read_cost(common_info->param, records, 1);
next->cost= cost; next->cost= cost;
next->length= curr->length+1; next->length= curr->length+1;
if (unlikely(trace.trace_started()))
trace.add("rows", records).add("cost", cost).add("chosen", true);
return TRUE; return TRUE;
} }
...@@ -6522,10 +6563,13 @@ void find_index_intersect_best_extension(THD *thd, ...@@ -6522,10 +6563,13 @@ void find_index_intersect_best_extension(THD *thd,
next.common_info= common_info; next.common_info= common_info;
Json_writer_array potential_index_intersect(thd, "potential_index_intersect");
INDEX_SCAN_INFO *rem_first_index_scan= *rem_first_index_scan_ptr; INDEX_SCAN_INFO *rem_first_index_scan= *rem_first_index_scan_ptr;
for (INDEX_SCAN_INFO **index_scan_ptr= rem_first_index_scan_ptr; for (INDEX_SCAN_INFO **index_scan_ptr= rem_first_index_scan_ptr;
*index_scan_ptr; index_scan_ptr++) *index_scan_ptr; index_scan_ptr++)
{ {
Json_writer_object selected(thd);
*rem_first_index_scan_ptr= *index_scan_ptr; *rem_first_index_scan_ptr= *index_scan_ptr;
*index_scan_ptr= rem_first_index_scan; *index_scan_ptr= rem_first_index_scan;
if (check_index_intersect_extension(thd, curr, *rem_first_index_scan_ptr, if (check_index_intersect_extension(thd, curr, *rem_first_index_scan_ptr,
...@@ -6578,6 +6622,9 @@ TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree, ...@@ -6578,6 +6622,9 @@ TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
Json_writer_object trace_idx_interect(thd, "analyzing_sort_intersect"); Json_writer_object trace_idx_interect(thd, "analyzing_sort_intersect");
if (unlikely(trace_idx_interect.trace_started()))
trace_idx_interect.add("cutoff_cost", read_time);
if (prepare_search_best_index_intersect(param, tree, &common, &init, if (prepare_search_best_index_intersect(param, tree, &common, &init,
read_time)) read_time))
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
......
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