From: Jorgen Loland Date: May 18 2011 7:41am Subject: bzr commit into mysql-trunk branch (jorgen.loland:3307) Bug#12551047 List-Archive: http://lists.mysql.com/commits/137513 X-Bug: 12551047 Message-Id: <20110518074106.42963B54@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8611266082014956190==" --===============8611266082014956190== 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 Bug#12551047: ASSERTION NO_ASSERT_ON_SYNTAX_ERROR FAILED IN OPT_TRACE_STMT::SYNTAX_ERROR 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 when doing RQG testing, so now tracing could be fixed and a few test cases added to optimizer_trace_range*.test @ sql/opt_range.cc Fix optimizer tracing in previously untested function get_best_covering_ror_intersect() 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:41:02 +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:41:02 +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:41:02 +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:41:02 +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); } --===============8611266082014956190== 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\ # tuolo45ig285tx52 # target_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800-12551047/ # testament_sha1: 77c1e378929bf1277644c54441bf97bea1e2472b # timestamp: 2011-05-18 09:41:05 +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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 8m9u3eG9W2bdbO1sdlcNvNMpYox0Zp107zUTuuddb1ac9WNz6uZp3+gnNq1PLrWpzNr5c8ngp3qa 9b+Hj9PnPa25ZnfW7qrE8JSdzJzPSuuuYOxYneutk+eRebVJLVLK/js1mHSp1uzbssmDi4z0Mb6a 2m5gTZ9wwFBVI2C0vi4DL0FRmeEG5rw5LJpZWYnoJO3g4MtMV1OPzZOdkz1YOnPnVGfl5bWni07v iwdPc14q5WbU0rGfK21Fls5x8GbDVaUGwLWVhNmhkUE05FePFWNWiYbbnha+M4C9O4S2iWjJba2a bC8AaacvavEhO5z5b2cvl05tjRk6y/Lj/c81PW4t+ldFueYTTlubWVcrYr8ujg5XVlLqWvN1c9N0 59tU3sz5niSQYUSR+CiJ6vTfswSJM+XA+vUt3cLdFVh1+VktpTjdaLZXTC2dWjDHXJnpXvP76apa x00OphLsC5yOpCPoigf6KRRPzWIsieC4qiCIpDcmhhhKKnNzh3dsSioYR0j9an7eUT1uwgHYrCez GN8vBerdqIYIiOxpD9xkSNPVhI/4MkwDR+YWqE9s/2WJilH8T/g5HFOdFkoumMsnHCI/WHMbpvP+ UnMxj+BuT/4Wm82uknFH757Dm+o4ajuLB2/w7TrkyfxSZmo7/A4yTknQbsUUclFOeYFpxMCZdhoZ Fk90x5qnc/3SdKdAd8dDjM/3BhJO8cSyOOhbGkUnFpAuS5UwlGlB9qpc/tY46TQMrpma8E/vTotH dkvqT9yOkwnwHE1mUmrQtG6RwSdyZOiQ53eHpTW3GkjpklRKNqXRync4FG0ydJbE7bajgmyYyyKT n2JZqTqOSZ7cZuNkmxjgZavE7pqO5k6Wwzk5FI6zakcE3SS0o1rGszRmSR7Ogf6CfefsP1n6yfsJ gfsJmaj8/lwPaep5FHXF3idHb1Jj8g/EfQWLCon0v1FfpH5j8xKGIzC4qJe/+tRklQoc5mNQzLGA +yJljUuVd/kflWlpaWlLFllksssWUWUsvZZYwqZDaNpc1FirFFjZsieRSGMi5tW0FahhP8yYj/AX NZKEoMjM0FixkRi0UpfVjmYLJqFWisxrGwcBguLJMDV/lhI0KGRZR+ossWKG6ZprGgbRqG0uMDJF G4YbBrJOIcnIpRSilhZLKUpSksSkDNISgfUIj0H1kolCkokUFiKKJsPil4PxRT4h2ROo+c6jrPTL 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 --===============8611266082014956190==--