From: Jorgen Loland Date: May 18 2011 7:22am Subject: bzr commit into mysql-trunk branch (jorgen.loland:3307) List-Archive: http://lists.mysql.com/commits/137604 Message-Id: <20110518072233.67F09B54@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2239954274683445889==" --===============2239954274683445889== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/wl4800/mysql-next-mr-opt-backporting-wl4800-12551047/ based on revid:guilhem.bichot@stripped 3307 Jorgen Loland 2011-05-18 Optimizer tracing: get_best_covering_ror_intersect() was not tested by any existing mtr test case so we had no test case to use with optimizer tracing either. John found a case entering this function when doing RQG testing, so now tracing could be fixed and a few test cases added to optimizer_trace_range* modified: mysql-test/include/optimizer_trace_range.inc mysql-test/r/optimizer_trace_range_no_prot.result mysql-test/r/optimizer_trace_range_ps_prot.result sql/opt_range.cc === modified file 'mysql-test/include/optimizer_trace_range.inc' --- a/mysql-test/include/optimizer_trace_range.inc 2011-04-06 09:19:23 +0000 +++ b/mysql-test/include/optimizer_trace_range.inc 2011-05-18 07:22:29 +0000 @@ -253,3 +253,36 @@ SELECT * FROM information_schema.OPTIMIZ --echo DROP TABLE t1; + +# Analyze whether to use covering roworder intersect +CREATE TABLE t1 ( + pk INT PRIMARY KEY, + i1 INT, + i2 INT, + v varchar(1), + INDEX i1_idx (i1), + INDEX v_idx (v,i1) +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1, 1, 9,'a'), (2, 2, 8,'b'), (3, 3, 7,'c'), + (4, 4, 6,'d'), (5, 5, 5,'e'); + +--echo +# Covering ROR intersect not chosen: only one scan used +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3; +--echo +SELECT * FROM information_schema.OPTIMIZER_TRACE; + +DROP INDEX i1_idx ON t1; +CREATE INDEX i1_i2_idx ON t1 (i2,i1); + +--echo +# Covering ROR intersect not chosen: cost +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND i2 = 1 AND v = 'a' AND pk < 3; +--echo +SELECT * FROM information_schema.OPTIMIZER_TRACE; + +# Todo: make a test case that choses ROR intersect + +--echo +DROP TABLE t1; === modified file 'mysql-test/r/optimizer_trace_range_no_prot.result' --- a/mysql-test/r/optimizer_trace_range_no_prot.result 2011-05-06 12:58:06 +0000 +++ b/mysql-test/r/optimizer_trace_range_no_prot.result 2011-05-18 07:22:29 +0000 @@ -4920,3 +4920,517 @@ EXPLAIN SELECT DISTINCT i1 FROM t1 WHERE } 0 0 DROP TABLE t1; +CREATE TABLE t1 ( +pk INT PRIMARY KEY, +i1 INT, +i2 INT, +v varchar(1), +INDEX i1_idx (i1), +INDEX v_idx (v,i1) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 1, 9,'a'), (2, 2, 8,'b'), (3, 3, 7,'c'), +(4, 4, 6,'d'), (5, 5, 5,'e'); + +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY,i1_idx,v_idx i1_idx 5 const 1 Using index condition; Using where + +SELECT * FROM information_schema.OPTIMIZER_TRACE; +QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3 { + "steps": [ + { + "join_preparation": { + "select#": 1, + "steps": [ + { + "expanded_query": "/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* steps */ + } /* join_preparation */ + }, + { + "join_optimization": { + "select#": 1, + "steps": [ + { + "condition_processing": { + "condition": "WHERE", + "original_condition": "((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))", + "steps": [ + { + "transformation": "equality_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "constant_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "trivial_condition_removal", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + } + ] /* steps */ + } /* condition_processing */ + }, + { + "ref_optimizer_key_uses": [ + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "v", + "equals": "'a'", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + } + ] /* ref_optimizer_key_uses */ + }, + { + "records_estimation": [ + { + "database": "test", + "table": "t1", + "range_analysis": { + "table_scan": { + "records": 5, + "cost": 4.1 + } /* table_scan */, + "potential_range_indices": [ + { + "index": "PRIMARY", + "usable": true, + "key_parts": [ + "pk" + ] /* key_parts */ + }, + { + "index": "i1_idx", + "usable": true, + "key_parts": [ + "i1" + ] /* key_parts */ + }, + { + "index": "v_idx", + "usable": true, + "key_parts": [ + "v", + "i1" + ] /* key_parts */ + } + ] /* potential_range_indices */, + "best_covering_index_scan": { + "index": "v_idx", + "cost": 2.0063, + "chosen": true + } /* best_covering_index_scan */, + "setup_range_conditions": [ + ] /* setup_range_conditions */, + "group_index_range": { + "chosen": false, + "cause": "not_group_by_or_distinct" + } /* group_index_range */, + "analyzing_range_alternatives": { + "range_scan_alternatives": [ + { + "index": "PRIMARY", + "ranges": [ + "pk < 3" + ] /* ranges */, + "index_only": false, + "records": 2, + "cost": 2.41, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + }, + { + "index": "i1_idx", + "ranges": [ + "1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + }, + { + "index": "v_idx", + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": true, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + } + ] /* range_scan_alternatives */, + "analyzing_roworder_intersect": { + "intersecting_indices": [ + { + "index": "i1_idx", + "usable": true, + "matching_records_now": 1, + "cumulated_cost": 2, + "isect_covering_with_this_index": false + }, + { + "index": "v_idx", + "usable": true, + "matching_records_now": 0.2, + "cumulated_cost": 2, + "isect_covering_with_this_index": true + } + ] /* intersecting_indices */, + "clustered_pk": { + "clustered_pk_scan_added_to_intersect": true, + "cumulated_cost": 1.1 + } /* clustered_pk */, + "records": 1, + "cost": 1.1, + "covering": false, + "chosen": true + } /* analyzing_roworder_intersect */, + "make_covering_roworder_intersect": { + "included_indices": [ + "v_idx" + ] /* included_indices */, + "chosen": false, + "cause": "only_one_index" + } /* make_covering_roworder_intersect */ + } /* analyzing_range_alternatives */, + "chosen_range_access_summary": { + "range_access_plan": { + "type": "index_roworder_intersect", + "records": 1, + "cost": 1.1, + "covering": false, + "clustered_pk_scan": true, + "intersect_of": [ + { + "type": "range_scan", + "index": "i1_idx", + "records": 1, + "ranges": [ + "1 <= i1 <= 1" + ] /* ranges */ + } + ] /* intersect_of */ + } /* range_access_plan */, + "records_for_plan": 1, + "cost_for_plan": 1.1, + "chosen": true + } /* chosen_range_access_summary */ + } /* range_analysis */ + } + ] /* records_estimation */ + }, + { + "considered_execution_plans": "..." + }, + { + "attaching_conditions_to_tables": { + "original_condition": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))", + "attached_conditions_computation": [ + ] /* attached_conditions_computation */, + "attached_conditions_summary": [ + { + "database": "test", + "table": "t1", + "attached": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* attached_conditions_summary */ + } /* attaching_conditions_to_tables */ + }, + { + "refine_plan": [ + { + "database": "test", + "table": "t1" + } + ] /* refine_plan */ + } + ] /* steps */ + } /* join_optimization */ + }, + { + "join_execution": { + "select#": 1, + "steps": [ + ] /* steps */ + } /* join_execution */ + } + ] /* steps */ +} 0 0 +DROP INDEX i1_idx ON t1; +CREATE INDEX i1_i2_idx ON t1 (i2,i1); + +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND i2 = 1 AND v = 'a' AND pk < 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY,v_idx,i1_i2_idx v_idx 9 const,const 1 Using index condition; Using where + +SELECT * FROM information_schema.OPTIMIZER_TRACE; +QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND i2 = 1 AND v = 'a' AND pk < 3 { + "steps": [ + { + "join_preparation": { + "select#": 1, + "steps": [ + { + "expanded_query": "/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* steps */ + } /* join_preparation */ + }, + { + "join_optimization": { + "select#": 1, + "steps": [ + { + "condition_processing": { + "condition": "WHERE", + "original_condition": "((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))", + "steps": [ + { + "transformation": "equality_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "constant_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "trivial_condition_removal", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + } + ] /* steps */ + } /* condition_processing */ + }, + { + "ref_optimizer_key_uses": [ + { + "database": "test", + "table": "t1", + "field": "v", + "equals": "'a'", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i2", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + } + ] /* ref_optimizer_key_uses */ + }, + { + "records_estimation": [ + { + "database": "test", + "table": "t1", + "range_analysis": { + "table_scan": { + "records": 5, + "cost": 4.1 + } /* table_scan */, + "potential_range_indices": [ + { + "index": "PRIMARY", + "usable": true, + "key_parts": [ + "pk" + ] /* key_parts */ + }, + { + "index": "v_idx", + "usable": true, + "key_parts": [ + "v", + "i1" + ] /* key_parts */ + }, + { + "index": "i1_i2_idx", + "usable": true, + "key_parts": [ + "i2", + "i1" + ] /* key_parts */ + } + ] /* potential_range_indices */, + "setup_range_conditions": [ + ] /* setup_range_conditions */, + "group_index_range": { + "chosen": false, + "cause": "not_group_by_or_distinct" + } /* group_index_range */, + "analyzing_range_alternatives": { + "range_scan_alternatives": [ + { + "index": "PRIMARY", + "ranges": [ + "pk < 3" + ] /* ranges */, + "index_only": false, + "records": 2, + "cost": 2.41, + "rowid_ordered": true, + "chosen": true + }, + { + "index": "v_idx", + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": true + }, + { + "index": "i1_i2_idx", + "ranges": [ + "1 <= i2 <= 1 AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + } + ] /* range_scan_alternatives */, + "analyzing_roworder_intersect": { + "intersecting_indices": [ + { + "index": "v_idx", + "usable": true, + "matching_records_now": 1, + "cumulated_cost": 2, + "isect_covering_with_this_index": false + }, + { + "index": "i1_i2_idx", + "usable": true, + "matching_records_now": 0.2, + "cumulated_cost": 2, + "isect_covering_with_this_index": true + } + ] /* intersecting_indices */, + "clustered_pk": { + "clustered_pk_scan_added_to_intersect": true, + "cumulated_cost": 1.1 + } /* clustered_pk */, + "records": 1, + "cost": 1.1, + "covering": false, + "chosen": true + } /* analyzing_roworder_intersect */, + "make_covering_roworder_intersect": { + "included_indices": [ + "v_idx", + "i1_i2_idx" + ] /* included_indices */, + "chosen": false, + "cause": "cost" + } /* make_covering_roworder_intersect */ + } /* analyzing_range_alternatives */, + "chosen_range_access_summary": { + "range_access_plan": { + "type": "index_roworder_intersect", + "records": 1, + "cost": 1.1, + "covering": false, + "clustered_pk_scan": true, + "intersect_of": [ + { + "type": "range_scan", + "index": "v_idx", + "records": 1, + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */ + } + ] /* intersect_of */ + } /* range_access_plan */, + "records_for_plan": 1, + "cost_for_plan": 1.1, + "chosen": true + } /* chosen_range_access_summary */ + } /* range_analysis */ + } + ] /* records_estimation */ + }, + { + "considered_execution_plans": "..." + }, + { + "attaching_conditions_to_tables": { + "original_condition": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))", + "attached_conditions_computation": [ + ] /* attached_conditions_computation */, + "attached_conditions_summary": [ + { + "database": "test", + "table": "t1", + "attached": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`pk` < 3))" + } + ] /* attached_conditions_summary */ + } /* attaching_conditions_to_tables */ + }, + { + "refine_plan": [ + { + "database": "test", + "table": "t1" + } + ] /* refine_plan */ + } + ] /* steps */ + } /* join_optimization */ + }, + { + "join_execution": { + "select#": 1, + "steps": [ + ] /* steps */ + } /* join_execution */ + } + ] /* steps */ +} 0 0 + +DROP TABLE t1; === modified file 'mysql-test/r/optimizer_trace_range_ps_prot.result' --- a/mysql-test/r/optimizer_trace_range_ps_prot.result 2011-05-06 12:58:06 +0000 +++ b/mysql-test/r/optimizer_trace_range_ps_prot.result 2011-05-18 07:22:29 +0000 @@ -4912,3 +4912,517 @@ EXPLAIN SELECT DISTINCT i1 FROM t1 WHERE } 0 0 DROP TABLE t1; +CREATE TABLE t1 ( +pk INT PRIMARY KEY, +i1 INT, +i2 INT, +v varchar(1), +INDEX i1_idx (i1), +INDEX v_idx (v,i1) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 1, 9,'a'), (2, 2, 8,'b'), (3, 3, 7,'c'), +(4, 4, 6,'d'), (5, 5, 5,'e'); + +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY,i1_idx,v_idx i1_idx 5 const 1 Using index condition; Using where + +SELECT * FROM information_schema.OPTIMIZER_TRACE; +QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3 { + "steps": [ + { + "join_preparation": { + "select#": 1, + "steps": [ + { + "expanded_query": "/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* steps */ + } /* join_preparation */ + }, + { + "join_optimization": { + "select#": 1, + "steps": [ + { + "condition_processing": { + "condition": "WHERE", + "original_condition": "((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))", + "steps": [ + { + "transformation": "equality_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "constant_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "trivial_condition_removal", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal('a', `test`.`t1`.`v`))" + } + ] /* steps */ + } /* condition_processing */ + }, + { + "ref_optimizer_key_uses": [ + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "v", + "equals": "'a'", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + } + ] /* ref_optimizer_key_uses */ + }, + { + "records_estimation": [ + { + "database": "test", + "table": "t1", + "range_analysis": { + "table_scan": { + "records": 5, + "cost": 4.1 + } /* table_scan */, + "potential_range_indices": [ + { + "index": "PRIMARY", + "usable": true, + "key_parts": [ + "pk" + ] /* key_parts */ + }, + { + "index": "i1_idx", + "usable": true, + "key_parts": [ + "i1" + ] /* key_parts */ + }, + { + "index": "v_idx", + "usable": true, + "key_parts": [ + "v", + "i1" + ] /* key_parts */ + } + ] /* potential_range_indices */, + "best_covering_index_scan": { + "index": "v_idx", + "cost": 2.0063, + "chosen": true + } /* best_covering_index_scan */, + "setup_range_conditions": [ + ] /* setup_range_conditions */, + "group_index_range": { + "chosen": false, + "cause": "not_group_by_or_distinct" + } /* group_index_range */, + "analyzing_range_alternatives": { + "range_scan_alternatives": [ + { + "index": "PRIMARY", + "ranges": [ + "pk < 3" + ] /* ranges */, + "index_only": false, + "records": 2, + "cost": 2.41, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + }, + { + "index": "i1_idx", + "ranges": [ + "1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + }, + { + "index": "v_idx", + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": true, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + } + ] /* range_scan_alternatives */, + "analyzing_roworder_intersect": { + "intersecting_indices": [ + { + "index": "i1_idx", + "usable": true, + "matching_records_now": 1, + "cumulated_cost": 2, + "isect_covering_with_this_index": false + }, + { + "index": "v_idx", + "usable": true, + "matching_records_now": 0.2, + "cumulated_cost": 2, + "isect_covering_with_this_index": true + } + ] /* intersecting_indices */, + "clustered_pk": { + "clustered_pk_scan_added_to_intersect": true, + "cumulated_cost": 1.1 + } /* clustered_pk */, + "records": 1, + "cost": 1.1, + "covering": false, + "chosen": true + } /* analyzing_roworder_intersect */, + "make_covering_roworder_intersect": { + "included_indices": [ + "v_idx" + ] /* included_indices */, + "chosen": false, + "cause": "only_one_index" + } /* make_covering_roworder_intersect */ + } /* analyzing_range_alternatives */, + "chosen_range_access_summary": { + "range_access_plan": { + "type": "index_roworder_intersect", + "records": 1, + "cost": 1.1, + "covering": false, + "clustered_pk_scan": true, + "intersect_of": [ + { + "type": "range_scan", + "index": "i1_idx", + "records": 1, + "ranges": [ + "1 <= i1 <= 1" + ] /* ranges */ + } + ] /* intersect_of */ + } /* range_access_plan */, + "records_for_plan": 1, + "cost_for_plan": 1.1, + "chosen": true + } /* chosen_range_access_summary */ + } /* range_analysis */ + } + ] /* records_estimation */ + }, + { + "considered_execution_plans": "..." + }, + { + "attaching_conditions_to_tables": { + "original_condition": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))", + "attached_conditions_computation": [ + ] /* attached_conditions_computation */, + "attached_conditions_summary": [ + { + "database": "test", + "table": "t1", + "attached": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* attached_conditions_summary */ + } /* attaching_conditions_to_tables */ + }, + { + "refine_plan": [ + { + "database": "test", + "table": "t1" + } + ] /* refine_plan */ + } + ] /* steps */ + } /* join_optimization */ + }, + { + "join_execution": { + "select#": 1, + "steps": [ + ] /* steps */ + } /* join_execution */ + } + ] /* steps */ +} 0 0 +DROP INDEX i1_idx ON t1; +CREATE INDEX i1_i2_idx ON t1 (i2,i1); + +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND i2 = 1 AND v = 'a' AND pk < 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY,v_idx,i1_i2_idx v_idx 9 const,const 1 Using index condition; Using where + +SELECT * FROM information_schema.OPTIMIZER_TRACE; +QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES +EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND i2 = 1 AND v = 'a' AND pk < 3 { + "steps": [ + { + "join_preparation": { + "select#": 1, + "steps": [ + { + "expanded_query": "/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))" + } + ] /* steps */ + } /* join_preparation */ + }, + { + "join_optimization": { + "select#": 1, + "steps": [ + { + "condition_processing": { + "condition": "WHERE", + "original_condition": "((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`v` = 'a') and (`test`.`t1`.`pk` < 3))", + "steps": [ + { + "transformation": "equality_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "constant_propagation", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + }, + { + "transformation": "trivial_condition_removal", + "resulting_condition": "((`test`.`t1`.`pk` < 3) and multiple equal(1, `test`.`t1`.`i1`) and multiple equal(1, `test`.`t1`.`i2`) and multiple equal('a', `test`.`t1`.`v`))" + } + ] /* steps */ + } /* condition_processing */ + }, + { + "ref_optimizer_key_uses": [ + { + "database": "test", + "table": "t1", + "field": "v", + "equals": "'a'", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i2", + "equals": "1", + "null_rejecting": false + }, + { + "database": "test", + "table": "t1", + "field": "i1", + "equals": "1", + "null_rejecting": false + } + ] /* ref_optimizer_key_uses */ + }, + { + "records_estimation": [ + { + "database": "test", + "table": "t1", + "range_analysis": { + "table_scan": { + "records": 5, + "cost": 4.1 + } /* table_scan */, + "potential_range_indices": [ + { + "index": "PRIMARY", + "usable": true, + "key_parts": [ + "pk" + ] /* key_parts */ + }, + { + "index": "v_idx", + "usable": true, + "key_parts": [ + "v", + "i1" + ] /* key_parts */ + }, + { + "index": "i1_i2_idx", + "usable": true, + "key_parts": [ + "i2", + "i1" + ] /* key_parts */ + } + ] /* potential_range_indices */, + "setup_range_conditions": [ + ] /* setup_range_conditions */, + "group_index_range": { + "chosen": false, + "cause": "not_group_by_or_distinct" + } /* group_index_range */, + "analyzing_range_alternatives": { + "range_scan_alternatives": [ + { + "index": "PRIMARY", + "ranges": [ + "pk < 3" + ] /* ranges */, + "index_only": false, + "records": 2, + "cost": 2.41, + "rowid_ordered": true, + "chosen": true + }, + { + "index": "v_idx", + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": true + }, + { + "index": "i1_i2_idx", + "ranges": [ + "1 <= i2 <= 1 AND 1 <= i1 <= 1" + ] /* ranges */, + "index_only": false, + "records": 1, + "cost": 2.21, + "rowid_ordered": true, + "chosen": false, + "cause": "cost" + } + ] /* range_scan_alternatives */, + "analyzing_roworder_intersect": { + "intersecting_indices": [ + { + "index": "v_idx", + "usable": true, + "matching_records_now": 1, + "cumulated_cost": 2, + "isect_covering_with_this_index": false + }, + { + "index": "i1_i2_idx", + "usable": true, + "matching_records_now": 0.2, + "cumulated_cost": 2, + "isect_covering_with_this_index": true + } + ] /* intersecting_indices */, + "clustered_pk": { + "clustered_pk_scan_added_to_intersect": true, + "cumulated_cost": 1.1 + } /* clustered_pk */, + "records": 1, + "cost": 1.1, + "covering": false, + "chosen": true + } /* analyzing_roworder_intersect */, + "make_covering_roworder_intersect": { + "included_indices": [ + "v_idx", + "i1_i2_idx" + ] /* included_indices */, + "chosen": false, + "cause": "cost" + } /* make_covering_roworder_intersect */ + } /* analyzing_range_alternatives */, + "chosen_range_access_summary": { + "range_access_plan": { + "type": "index_roworder_intersect", + "records": 1, + "cost": 1.1, + "covering": false, + "clustered_pk_scan": true, + "intersect_of": [ + { + "type": "range_scan", + "index": "v_idx", + "records": 1, + "ranges": [ + "a <= v <= a AND 1 <= i1 <= 1" + ] /* ranges */ + } + ] /* intersect_of */ + } /* range_access_plan */, + "records_for_plan": 1, + "cost_for_plan": 1.1, + "chosen": true + } /* chosen_range_access_summary */ + } /* range_analysis */ + } + ] /* records_estimation */ + }, + { + "considered_execution_plans": "..." + }, + { + "attaching_conditions_to_tables": { + "original_condition": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))", + "attached_conditions_computation": [ + ] /* attached_conditions_computation */, + "attached_conditions_summary": [ + { + "database": "test", + "table": "t1", + "attached": "((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i2` = 1) and (`test`.`t1`.`pk` < 3))" + } + ] /* attached_conditions_summary */ + } /* attaching_conditions_to_tables */ + }, + { + "refine_plan": [ + { + "database": "test", + "table": "t1" + } + ] /* refine_plan */ + } + ] /* steps */ + } /* join_optimization */ + }, + { + "join_execution": { + "select#": 1, + "steps": [ + ] /* steps */ + } /* join_execution */ + } + ] /* steps */ +} 0 0 + +DROP TABLE t1; === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2011-05-13 14:17:54 +0000 +++ b/sql/opt_range.cc 2011-05-18 07:22:29 +0000 @@ -5196,17 +5196,12 @@ TRP_ROR_INTERSECT *get_best_covering_ror ROR_SCAN_INFO **ror_scans_end= tree->ror_scans_end; DBUG_ENTER("get_best_covering_ror_intersect"); -#if 0 // Jorgen will fix with BUG#12551047 - // None of our tests enter this function - Opt_trace_object (¶m->thd->opt_trace). - add("get_best_covering_roworder_intersect", true). - add("untested_code", true). - add("need_tracing",true); -#endif - if (!param->thd->optimizer_switch_flag(OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT)) DBUG_RETURN(NULL); + Opt_trace_object trace_covering (¶m->thd->opt_trace, + "make_covering_roworder_intersect"); + for (ROR_SCAN_INFO **scan= tree->ror_scans; scan != ror_scans_end; ++scan) (*scan)->key_components= param->table->key_info[(*scan)->keynr].key_parts; @@ -5237,6 +5232,10 @@ TRP_ROR_INTERSECT *get_best_covering_ror DBUG_EXECUTE("info", print_ror_scans_arr(param->table, "building covering ROR-I", ror_scan_mark, ror_scans_end);); + + // Note: trace_idx.end() is called to close this object after this loop. + Opt_trace_array trace_idx(¶m->thd->opt_trace, "included_indices"); + do { /* @@ -5264,17 +5263,37 @@ TRP_ROR_INTERSECT *get_best_covering_ror /* I=I-first(I) */ total_cost += (*ror_scan_mark)->index_read_cost; records += (*ror_scan_mark)->records; + + trace_idx.add_utf8(param->table->key_info[(*ror_scan_mark)->keynr].name); + DBUG_PRINT("info", ("Adding scan on %s", param->table->key_info[(*ror_scan_mark)->keynr].name)); if (total_cost > read_time) + { + trace_idx.end(); + trace_covering.add("chosen", false).add_alnum("cause", "cost"); DBUG_RETURN(NULL); + } /* F=F-covered by first(I) */ bitmap_union(covered_fields, &(*ror_scan_mark)->covered_fields); all_covered= bitmap_is_subset(¶m->needed_fields, covered_fields); } while ((++ror_scan_mark < ror_scans_end) && !all_covered); + + trace_idx.end(); - if (!all_covered || (ror_scan_mark - tree->ror_scans) == 1) + if (!all_covered) + { + trace_covering.add("chosen", false). + add_alnum("cause", "not_completely_covering"); + DBUG_RETURN(NULL); + } + + if ((ror_scan_mark - tree->ror_scans) == 1) + { + trace_covering.add("chosen", false). + add_alnum("cause", "only_one_index"); DBUG_RETURN(NULL); + } /* Ok, [tree->ror_scans .. ror_scan) holds covering index_intersection with @@ -5292,7 +5311,10 @@ TRP_ROR_INTERSECT *get_best_covering_ror DBUG_PRINT("info", ("Covering ROR-intersect full cost: %g", total_cost)); if (total_cost > read_time) + { + trace_covering.add("chosen", false).add_alnum("cause", "cost"); DBUG_RETURN(NULL); + } TRP_ROR_INTERSECT *trp; if (!(trp= new (param->mem_root) TRP_ROR_INTERSECT)) @@ -5313,6 +5335,11 @@ TRP_ROR_INTERSECT *get_best_covering_ror DBUG_PRINT("info", ("Returning covering ROR-intersect plan: cost %g, records %lu", trp->read_cost, (ulong) trp->records)); + + trace_covering.add("records", trp->records). + add("cost", trp->read_cost). + add("chosen", true); + DBUG_RETURN(trp); } --===============2239954274683445889== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # od9z0djfndtec94p # target_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800-12551047/ # testament_sha1: 47bc10c9034c7fa5ec2755c0fe13e3311162c328 # timestamp: 2011-05-18 09:22:33 +0200 # source_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800/ # base_revision_id: guilhem.bichot@stripped\ # 1m0zpn029ejl03ap # # Begin bundle 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 QkBT/qyk --===============2239954274683445889==--