mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Added optimizer_trace info for index_intersects
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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);
|
||||||
|
Reference in New Issue
Block a user