[MDEV-6003] EITS: ref access, keypart2=const vs keypart2=expr - inconsistent filtered% value Created: 2014-04-02  Updated: 2014-04-28  Resolved: 2014-04-28

Status: Closed
Project: MariaDB Server
Component/s: None
Affects Version/s: 10.0.9
Fix Version/s: 10.0.11

Type: Bug Priority: Major
Reporter: Sergei Petrunia Assignee: Sergei Petrunia
Resolution: Fixed Votes: 0
Labels: eits


 Description   

Prepare the dataset:

create table ten(a int);
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
  kp1 int, kp2 int, 
  filler1 char(100),
  filler2 char(100),
  key(kp1, kp2)
);
 
insert into t1 
select 
  A.a,
  B.a,
  'filler-data-1',
  'filler-data-2'
from ten A, ten B, ten C;
set histogram_size=100;
set use_stat_tables='preferably';
set optimizer_use_condition_selectivity=4;
analyze table t1 persistent for all;

Now, let's try a ref access. Let's start without ref(const):

explain extended select * from ten, t1 where t1.kp1=ten.a and t1.kp2=ten.a+1;
+------+-------------+-------+------+---------------+------+---------+----------------+------+----------+-----------------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref            | rows | filtered | Extra                 |
+------+-------------+-------+------+---------------+------+---------+----------------+------+----------+-----------------------+
|    1 | SIMPLE      | ten   | ALL  | NULL          | NULL | NULL    | NULL           |   10 |   100.00 | Using where           |
|    1 | SIMPLE      | t1    | ref  | kp1           | kp1  | 10      | j19.ten.a,func |   10 |   100.00 | Using index condition |
+------+-------------+-------+------+---------------+------+---------+----------------+------+----------+-----------------------+

So, ref access will give us 10 rows (on every index lookup). Ok.

explain extended select * from ten, t1 where t1.kp1=ten.a and t1.kp2=4;
+------+-------------+-------+------+---------------+------+---------+-----------------+------+----------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref             | rows | filtered | Extra       |
+------+-------------+-------+------+---------------+------+---------+-----------------+------+----------+-------------+
|    1 | SIMPLE      | ten   | ALL  | NULL          | NULL | NULL    | NULL            |   10 |   100.00 | Using where |
|    1 | SIMPLE      | t1    | ref  | kp1           | kp1  | 10      | j19.ten.a,const |   10 |     9.90 |             |
+------+-------------+-------+------+---------------+------+---------+-----------------+------+----------+-------------+

This one seems to be wrong. ref access still produces 10 rows, but then filtered=9.90% , which is what selectivity would be if we weren't using ref access.

Indeed, if we disable ref access:

explain extended select * from ten, t1 ignore index(kp1) where t1.kp1=ten.a and t1.kp2=4;
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                           |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+
|    1 | SIMPLE      | ten   | ALL  | NULL          | NULL | NULL    | NULL |   10 |   100.00 |                                                 |
|    1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL | 1000 |     9.90 | Using where; Using join buffer (flat, BNL join) |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+

we get selectivity=9.90%.



 Comments   
Comment by Sergei Petrunia [ 2014-04-21 ]

Patch submitted for review

Comment by Sergei Petrunia [ 2014-04-25 ]

For this particular example, these lines in table_cond_selectivity()

            if (keyparts == keyuse->keypart &&
                !(~(keyuse->val->used_tables()) & pos->ref_depend_map) &&
                !(found_part_ref_or_null & keyuse->optimize))

are incorrect

Comment by Sergei Petrunia [ 2014-04-25 ]

The other place in that function that is wrong (it becomes apparent after you fix the first one) is:

            if (keyuse->val->const_item())
              sel*= table->field[fldno]->cond_selectivity; 

Here we should divide, not multiply.

Comment by Sergei Petrunia [ 2014-04-25 ]

Committed another patch for review.

Generated at Thu Feb 08 07:08:39 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.