Details
-
Bug
-
Status: Closed (View Workflow)
-
Critical
-
Resolution: Fixed
-
10.4.18, 10.5.9
Description
When using set optimizer_use_condition_selectivity=1 we get a better query plan than for set optimizer_use_condition_selectivity=[2|3|4|5]
set optimizer_use_condition_selectivity=1;
|
analyze SELECT sysapproval_approver0.`sys_id`
|
FROM ((sysapproval_approver sysapproval_approver0
|
INNER JOIN task task1
|
ON sysapproval_approver0.`sysapproval` = task1.`sys_id`
|
AND (( task1.`sys_domain_path` = '/'
|
OR task1.`sys_domain_path` LIKE '!!!/!!#/!!$/%'
|
OR task1.`sys_domain_path` LIKE '!!!/!!!/%' )))
|
INNER JOIN task task2
|
ON task1.`parent` = task2.`sys_id`
|
AND (( task2.`sys_domain_path` = '/'
|
OR task2.`sys_domain_path` LIKE '!!!/!!#/!!$/%'
|
OR task2.`sys_domain_path` LIKE '!!!/!!!/%' )))
|
WHERE task2.`sys_id` LIKE '8e7792a7dbfffb00fff8a345ca961934%'
|
AND ( sysapproval_approver0.`sys_domain_path` = '/'
|
OR sysapproval_approver0.`sys_domain_path` LIKE '!!!/!!#/!!$/%'
|
OR sysapproval_approver0.`sys_domain_path` LIKE '!!!/!!!/%' )
|
ORDER BY sysapproval_approver0.`order`
|
LIMIT 0, 50 ;
|
+------+-------------+-----------------------+-------+------------------------------------------------------+---------------------------+---------+-----------------+------+--------+----------+------------+----------------------------------------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
|
+------+-------------+-----------------------+-------+------------------------------------------------------+---------------------------+---------+-----------------+------+--------+----------+------------+----------------------------------------------+
|
| 1 | SIMPLE | task2 | range | PRIMARY,sys_class_name_2,sys_domain_path | PRIMARY | 96 | NULL | 1 | 0.00 | 100.00 | 100.00 | Using where; Using temporary; Using filesort |
|
| 1 | SIMPLE | task1 | ref | PRIMARY,sys_class_name_2,sys_domain_path,task_parent | task_parent | 99 | tt.task2.sys_id | 255 | NULL | 100.00 | NULL | Using index condition; Using where |
|
| 1 | SIMPLE | sysapproval_approver0 | ref | sysapproval_approver_ref5,sys_domain_path | sysapproval_approver_ref5 | 99 | tt.task1.sys_id | 176 | NULL | 100.00 | NULL | Using index condition; Using where |
|
+------+-------------+-----------------------+-------+------------------------------------------------------+---------------------------+---------+-----------------+------+--------+----------+------------+----------------------------------------------+
|
3 rows in set (0.001 sec)
|
|
set optimizer_use_condition_selectivity=[2|3|4|5]; -- use 2 or 3 or 4 or 5
|
|
+------+-------------+-----------------------+--------+------------------------------------------------------+---------------------------+---------+--------------------------------------+---------+------------+----------+------------+----------------------------------------------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
|
+------+-------------+-----------------------+--------+------------------------------------------------------+---------------------------+---------+--------------------------------------+---------+------------+----------+------------+----------------------------------------------------+
|
| 1 | SIMPLE | sysapproval_approver0 | range | sysapproval_approver_ref5,sys_domain_path | sysapproval_approver_ref5 | 99 | NULL | 1856810 | 1195428.00 | 100.00 | 100.00 | Using index condition; Using where; Using filesort |
|
| 1 | SIMPLE | task1 | eq_ref | PRIMARY,sys_class_name_2,sys_domain_path,task_parent | PRIMARY | 96 | tt.sysapproval_approver0.sysapproval | 1 | 0.00 | 100.00 | 100.00 | Using where |
|
| 1 | SIMPLE | task2 | eq_ref | PRIMARY,sys_class_name_2,sys_domain_path | PRIMARY | 96 | tt.task1.parent | 1 | NULL | 100.00 | NULL | Using where |
|
+------+-------------+-----------------------+--------+------------------------------------------------------+---------------------------+---------+--------------------------------------+---------+------------+----------+------------+----------------------------------------------------+
|
3 rows in set (15.906 sec)
|
|
A workaround has been discovered:
set optimizer_switch="extended_keys=off";
|
extended_keys=off produces a much better query plan, returning results in 0.001 seconds even when set optimizer_use_condition_selectivity=4.
Attachments
Issue Links
- is blocked by
-
MDEV-26974 Improve selectivity and related costs in optimizer
-
- Closed
-
- relates to
-
MDEV-22537 optimizer_use_cond_selectivity > 1 can cause slow plans
-
- Closed
-
-
MDEV-23707 Fix condition selectivity computation for join prefixes
-
- Stalled
-
- mentioned in
-
Page Failed to load
-
Page Failed to load
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
The issue was that calc_cond_selectivity_for_table preferred ranges with
many parts and when deciding on which selectivity to use.
Fixed by going through ranges according to the number of rows in the range.
This ensures that selectivity from ranges with few rows will be preferred
over ranges with many rows for indexes that uses the same columns.