mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	"Range Checked for Each Record" should be only employed when the other option would be cross-product join (i.e. the other option is so bad that we hardly risk anything). Previous logic was: use RCfER if there are no possible quick selects, or quick select would read > 100 rows. Also, it didn't always work as expected due to range optimizer changing table->quick_keys and us looking at sel->quick_keys. Another angle is that recent versions have enabled use of Join Buffering in e.g. outer joins. This further reduces the range of cases where RCfER should be used. We are still unable to estimate the cost of RCfER with any precision, so now changing the condition of "no quick select or quick->records> 100" to a hopefully better condition "no quick select or quick would cost more than full table scan".
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #
 | |
| # Range optimizer (and related) tests that need InnoDB.
 | |
| # 
 | |
| drop table if exists t0, t1, t2;
 | |
| #
 | |
| # MDEV-6735: Range checked for each record used with key
 | |
| #
 | |
| create table t0(a int);
 | |
| insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 | |
| create table t1(a int);
 | |
| insert into t1 select A.a + B.a* 10 + C.a * 100 + D.a * 1000
 | |
| from t0 A, t0 B, t0 C, t0 D;
 | |
| create table t2 ( 
 | |
| a int,
 | |
| b int,
 | |
| filler1 char(100),
 | |
| filler2 char(100),
 | |
| filler3 char(100),
 | |
| filler4 char(100),
 | |
| key(a),
 | |
| key(b)
 | |
| ) engine=innodb;
 | |
| insert into t2 
 | |
| select 
 | |
| a,a,
 | |
| repeat('0123456789', 10), 
 | |
| repeat('0123456789', 10), 
 | |
| repeat('0123456789', 10),
 | |
| repeat('0123456789', 10)
 | |
| from t1;
 | |
| analyze table t2;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t2	analyze	status	OK
 | |
| # The following must not use "Range checked for each record":
 | |
| explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t0	ALL	NULL	NULL	NULL	NULL	10	
 | |
| 1	SIMPLE	t2	range	a,b	b	5	NULL	201	Using where; Using join buffer (flat, BNL join)
 | |
| drop table t0,t1,t2;
 |