8058 lines
291 KiB
Plaintext
8058 lines
291 KiB
Plaintext
use test;
|
|
Test read-locality of READ-BACKUP
|
|
create table test.t1 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d int,
|
|
unique(b) using hash,
|
|
key(c),
|
|
key(a,c))
|
|
comment="NDB_TABLE=READ_BACKUP=1"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
create table test.t2 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d text,
|
|
unique(b) using hash,
|
|
key(c))
|
|
comment="NDB_TABLE=READ_BACKUP=1"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
2
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
2
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
2
|
|
set @partitions = 'PARTITION p2 VALUES IN (2)';
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (2);
|
|
Hint node by 2 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
drop table test.t1;
|
|
drop table test.t2;
|
|
Test read-locality after ALTER TABLE into READ-BACKUP
|
|
create table test.t1 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d int,
|
|
unique(b) using hash,
|
|
key(c),
|
|
key(a,c))
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
create table test.t2 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d text,
|
|
unique(b) using hash,
|
|
key(c))
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
alter table t1 algorithm=inplace, comment="NDB_TABLE=READ_BACKUP=1";
|
|
alter table t2 algorithm=inplace, comment="NDB_TABLE=READ_BACKUP=1";
|
|
-- t2 --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 4
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 0
|
|
ForceVarPart: 1
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
b Int NULL AT=FIXED ST=MEMORY
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
d Text(256,2000,0;utf8mb4_0900_ai_ci) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_XX_3
|
|
-- Indexes --
|
|
PRIMARY KEY(a) - UniqueHashIndex
|
|
PRIMARY(a) - OrderedIndex
|
|
b$unique(b) - UniqueHashIndex
|
|
c(c) - OrderedIndex
|
|
-- t2/PRIMARY --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 0
|
|
Index type: OrderedIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
a Int NOT NULL AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/PRIMARY --
|
|
Version: Any
|
|
Fragment type: FragUndefined
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: yes
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
-- Attributes --
|
|
a Int NOT NULL DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
|
|
|
|
-- t2/b$unique --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 1
|
|
Index type: UniqueHashIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/b$unique --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$PK Unsigned [2] NOT NULL AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(b) - UniqueHashIndex
|
|
|
|
-- t2/c --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 0
|
|
Index type: OrderedIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/c --
|
|
Version: Any
|
|
Fragment type: FragUndefined
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: yes
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
-- Attributes --
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
|
|
|
|
-- NDB$BLOB_XX_3 --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 4
|
|
Number of primary keys: 2
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 0
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$PART Unsigned PRIMARY KEY AT=FIXED ST=MEMORY
|
|
NDB$PKID Unsigned NOT NULL AT=FIXED ST=MEMORY
|
|
NDB$DATA Longvarchar(2000;binary) NOT NULL AT=MEDIUM_VAR ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(a, NDB$PART) - UniqueHashIndex
|
|
|
|
|
|
NDBT_ProgramExit: 0 - OK
|
|
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
2
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
2
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
2
|
|
set @partitions = 'PARTITION p2 VALUES IN (2)';
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (2);
|
|
Hint node by 2 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
Executing RESTART on all nodes.
|
|
Starting shutdown. This may take a while. Please wait...
|
|
All DB nodes are being restarted.
|
|
|
|
-- t2 --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 4
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 0
|
|
ForceVarPart: 1
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
b Int NULL AT=FIXED ST=MEMORY
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
d Text(256,2000,0;utf8mb4_0900_ai_ci) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_XX_3
|
|
-- Indexes --
|
|
PRIMARY KEY(a) - UniqueHashIndex
|
|
PRIMARY(a) - OrderedIndex
|
|
b$unique(b) - UniqueHashIndex
|
|
c(c) - OrderedIndex
|
|
-- t2/PRIMARY --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 0
|
|
Index type: OrderedIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
a Int NOT NULL AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/PRIMARY --
|
|
Version: Any
|
|
Fragment type: FragUndefined
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: yes
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
-- Attributes --
|
|
a Int NOT NULL DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
|
|
|
|
-- t2/b$unique --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 1
|
|
Index type: UniqueHashIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/b$unique --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
b Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$PK Unsigned [2] NOT NULL AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(b) - UniqueHashIndex
|
|
|
|
-- t2/c --
|
|
Version: Any
|
|
Base table: t2
|
|
Number of attributes: 1
|
|
Logging: 0
|
|
Index type: OrderedIndex
|
|
Index status: Retrieved
|
|
-- Attributes --
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
-- IndexTable XX/c --
|
|
Version: Any
|
|
Fragment type: FragUndefined
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: yes
|
|
Number of attributes: 2
|
|
Number of primary keys: 1
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 2
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
-- Attributes --
|
|
c Int NULL AT=FIXED ST=MEMORY
|
|
NDB$TNODE Unsigned [64] PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(NDB$TNODE) - UniqueHashIndex
|
|
|
|
-- NDB$BLOB_XX_3 --
|
|
Version: Any
|
|
Fragment type: HashMapPartition
|
|
K Value: 6
|
|
Min load factor: 78
|
|
Max load factor: 80
|
|
Temporary table: no
|
|
Number of attributes: 4
|
|
Number of primary keys: 2
|
|
Length of frm data: XXX
|
|
Max Rows: 0
|
|
Row Checksum: 1
|
|
Row GCI: 1
|
|
SingleUserMode: 0
|
|
ForceVarPart: 0
|
|
PartitionCount: 8
|
|
FragmentCount: 8
|
|
PartitionBalance: FOR_RP_BY_LDM
|
|
ExtraRowGciBits: 0
|
|
ExtraRowAuthorBits: 0
|
|
TableStatus: Retrieved
|
|
Table options: readbackup
|
|
HashMap: DEFAULT-HASHMAP-3840-8
|
|
-- Attributes --
|
|
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
|
|
NDB$PART Unsigned PRIMARY KEY AT=FIXED ST=MEMORY
|
|
NDB$PKID Unsigned NOT NULL AT=FIXED ST=MEMORY
|
|
NDB$DATA Longvarchar(2000;binary) NOT NULL AT=MEDIUM_VAR ST=MEMORY
|
|
-- Indexes --
|
|
PRIMARY KEY(a, NDB$PART) - UniqueHashIndex
|
|
|
|
|
|
NDBT_ProgramExit: 0 - OK
|
|
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
2
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
2
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
2
|
|
set @partitions = 'PARTITION p2 VALUES IN (2)';
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (2);
|
|
Hint node by 2 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
drop table test.t1;
|
|
drop table test.t2;
|
|
Test read-locality of FULLY-REPLICATED
|
|
create table test.t1 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d int,
|
|
unique(b) using hash,
|
|
key(c),
|
|
key(a,c))
|
|
comment="NDB_TABLE=FULLY_REPLICATED=1"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
create table test.t2 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d text,
|
|
unique(b) using hash,
|
|
key(c))
|
|
comment="NDB_TABLE=FULLY_REPLICATED=1"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
2
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
2
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
2
|
|
set @partitions = 'PARTITION p2 VALUES IN (2)';
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (2);
|
|
Hint node by 2 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
Nodegroup 1 created
|
|
alter table t1 algorithm=inplace, reorganize partition;
|
|
alter table t2 algorithm=inplace, reorganize partition;
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
4
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
4
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
4
|
|
set @partitions = 'PARTITION p4 VALUES IN (4)';
|
|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
|
|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (4);
|
|
Hint node by 4 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (3);
|
|
Hint node by 3 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (2);
|
|
Hint node by 2 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
Nodegroup 2 created
|
|
alter table t1 algorithm=inplace, reorganize partition;
|
|
alter table t2 algorithm=inplace, reorganize partition;
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
6
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
6
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
6
|
|
set @partitions = 'PARTITION p6 VALUES IN (6)';
|
|
set @partitions = concat(@partitions,',PARTITION p5 VALUES IN (5)');
|
|
set @partitions = concat(@partitions,',PARTITION p4 VALUES IN (4)');
|
|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
|
|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p6 VALUES IN (6),PARTITION p5 VALUES IN (5),PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (6);
|
|
Hint node by 6 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (5);
|
|
Hint node by 5 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (4);
|
|
Hint node by 4 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (3);
|
|
Hint node by 3 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (2);
|
|
Hint node by 2 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
drop table test.t1;
|
|
drop table test.t2;
|
|
Drop Node Group 2 done
|
|
Drop Node Group 1 done
|
|
Test read-locality of FULLY-REPLICATED with FOR_RA_BY_NODE
|
|
create table test.t1 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d int,
|
|
unique(b) using hash,
|
|
key(c),
|
|
key(a,c))
|
|
comment="NDB_TABLE=FULLY_REPLICATED=1,PARTITION_BALANCE=FOR_RA_BY_NODE"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
create table test.t2 (a int primary key,
|
|
b int,
|
|
c int,
|
|
d text,
|
|
unique(b) using hash,
|
|
key(c))
|
|
comment="NDB_TABLE=FULLY_REPLICATED=1,PARTITION_BALANCE=FOR_RA_BY_NODE"
|
|
engine=ndb;
|
|
Warnings:
|
|
Warning 1121 Ndb does not support unique index on NULL valued attributes, index access with NULL value will become full table scan
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
2
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
2
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
2
|
|
set @partitions = 'PARTITION p2 VALUES IN (2)';
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (2);
|
|
Hint node by 2 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 2
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
Nodegroup 1 created
|
|
alter table t1 algorithm=inplace, reorganize partition;
|
|
alter table t2 algorithm=inplace, reorganize partition;
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
4
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
4
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
4
|
|
set @partitions = 'PARTITION p4 VALUES IN (4)';
|
|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
|
|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (4);
|
|
Hint node by 4 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (3);
|
|
Hint node by 3 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (2);
|
|
Hint node by 2 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 4
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
Nodegroup 2 created
|
|
alter table t1 algorithm=inplace, reorganize partition;
|
|
alter table t2 algorithm=inplace, reorganize partition;
|
|
select id into @t1_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t1';
|
|
select id into @t1ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t1_id and type = 3;
|
|
select id into @t2_id from ndbinfo.ndb$dict_obj_info where fq_name = 'test/def/t2';
|
|
select id into @t2ui_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and type = 3;
|
|
select id into @t2bt_id from ndbinfo.ndb$dict_obj_info where parent_obj_id = @t2_id and fq_name like 'test/def/NDB$BLOB%';
|
|
Put some data in.
|
|
Make it more interesting for joining
|
|
update test.t1 set c=c+1, d=d+1;
|
|
select count(distinct node_id) into @nodes
|
|
from ndbinfo.ndb$membership where group_id < 0xFFFFFF00;
|
|
Check replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1'
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with table data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where fq_name='test/def/t1';
|
|
count(distinct node_id)
|
|
6
|
|
Check UI replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with UI data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t1ui_id;
|
|
count(distinct node_id)
|
|
6
|
|
Put some data in.
|
|
insert into test.t2 select a,b,c,repeat('BJC',300) from test.t1;
|
|
Check blob table replicas
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id
|
|
and fragment_num=0;
|
|
count(distinct node_id)
|
|
2
|
|
Check nodes with blob data
|
|
select count(distinct node_id)
|
|
from ndbinfo.operations_per_fragment
|
|
where table_id = @t2bt_id;
|
|
count(distinct node_id)
|
|
6
|
|
set @partitions = 'PARTITION p6 VALUES IN (6)';
|
|
set @partitions = concat(@partitions,',PARTITION p5 VALUES IN (5)');
|
|
set @partitions = concat(@partitions,',PARTITION p4 VALUES IN (4)');
|
|
set @partitions = concat(@partitions,',PARTITION p3 VALUES IN (3)');
|
|
set @partitions = concat(@partitions,',PARTITION p2 VALUES IN (2)');
|
|
set @partitions = concat(@partitions,',PARTITION p1 VALUES IN (1)');
|
|
set @@new = 1;
|
|
create table hints (i int primary key) engine=ndb partition by list(i) (PARTITION p6 VALUES IN (6),PARTITION p5 VALUES IN (5),PARTITION p4 VALUES IN (4),PARTITION p3 VALUES IN (3),PARTITION p2 VALUES IN (2),PARTITION p1 VALUES IN (1));
|
|
insert into hints values (6);
|
|
Hint node by 6 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 6;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (5);
|
|
Hint node by 5 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 5;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (4);
|
|
Hint node by 4 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 4;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (3);
|
|
Hint node by 3 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 3;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (2);
|
|
Hint node by 2 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 2;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
insert into hints values (1);
|
|
Hint node by 1 of 6
|
|
Tests on T1 (!Blobs)
|
|
Test some basic NdbApi
|
|
PK lookups
|
|
explain select * from test.t1 where t1.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref PRIMARY,a PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t1 where t1.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t1 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # range c c 5 NULL # # Using pushed condition (`test`.`t1`.`c` > 6); Using MRR
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where (`test`.`t1`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Test pushed queries (SPJ)
|
|
Pushed pk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed uk->pk
|
|
Lookup to get a.d, feeding pk lookup of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a
|
|
where a.b = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref b b 5 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`a` = `test`.`a`.`d`) and (`test`.`a`.`b` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed pk->uk
|
|
Lookup to get a.d, feeding uk lookup of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b
|
|
where a.a = 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # eq_ref PRIMARY,a PRIMARY 4 const # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`b` = `test`.`a`.`d`) and (`test`.`a`.`a` = 6))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding pk lookups of b.a
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref PRIMARY,a PRIMARY 4 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`a` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.a;
|
|
commit;
|
|
|
|
Pushed scan originating sub-lookups
|
|
Table scan to get a.d, feeding uk lookups of b.b
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # ALL NULL NULL NULL NULL # # Parent of 2 pushed join@1; Using pushed condition (`test`.`a`.`d` is not null)
|
|
1 SIMPLE b # eq_ref b b 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where (`test`.`b`.`b` = `test`.`a`.`d`)
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
a.d = b.b;
|
|
commit;
|
|
|
|
Pushed scan originating sub-scans
|
|
Range scan on a.a > 10 getting a.d, feeding range scans on b.c = a.d
|
|
explain select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a # range PRIMARY,a PRIMARY 4 NULL # # Parent of 2 pushed join@1; Using pushed condition ((`test`.`a`.`a` > 10) and (`test`.`a`.`d` is not null)); Using MRR
|
|
1 SIMPLE b # ref c c 5 test.a.d # # Child of 'a' in pushed join@1
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`a`.`a` AS `a`,`test`.`a`.`d` AS `d`,`test`.`b`.`d` AS `d` from `test`.`t1` `a` join `test`.`t1` `b` where ((`test`.`b`.`c` = `test`.`a`.`d`) and (`test`.`a`.`a` > 10))
|
|
Error insert to ensure that SPJ requests are purely local
|
|
|
|
begin;
|
|
select * from hints where i = 1;
|
|
select a.a, a.d, b.d
|
|
from
|
|
test.t1 a
|
|
join
|
|
test.t1 b
|
|
on
|
|
b.c=a.d
|
|
where
|
|
a.a>10;
|
|
commit;
|
|
|
|
Tests on T2 (Blobs)
|
|
Test some basic NdbApi
|
|
explain select * from test.t2 where t2.a=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref PRIMARY PRIMARY 4 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`a` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
UI lookups
|
|
explain select * from test.t2 where t2.b=6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # eq_ref b b 5 const # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`b` = 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
OI scan
|
|
explain select * from test.t2 where c > 6;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # range c c 5 NULL # # Using pushed condition (`test`.`t2`.`c` > 6)
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2` where (`test`.`t2`.`c` > 6)
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
Table scan
|
|
explain select * from test.t2;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t2 # ALL NULL NULL NULL NULL # # NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`
|
|
Error insert to ensure that TC requests are purely local
|
|
|
|
|
|
drop table hints;
|
|
delete from t1;
|
|
delete from t2;
|
|
drop table test.t1;
|
|
drop table test.t2;
|