Hello! I have indeed try a use case like yours:
0: jdbc:ignite:thin://127.0.0.1/> create index on b(x,y); No rows affected (9,729 seconds) 0: jdbc:ignite:thin://127.0.0.1/> select count(*) from a; COUNT(*) 1 1 row selected (0,017 seconds) 0: jdbc:ignite:thin://127.0.0.1/> select count(*) from b; COUNT(*) 4194304 1 row selected (0,024 seconds) 0: jdbc:ignite:thin://127.0.0.1/> select a.x,a.y from a join b where a.y = b.y and a.x = b.x; X 1 Y 1 1 row selected (0,005 seconds) 0: jdbc:ignite:thin://127.0.0.1/> explain select a.x,a.y from a join b where a.y = b.y and a.x = b.x; PLAN SELECT __Z0.X AS __C0_0, __Z0.Y AS __C0_1 FROM PUBLIC.A __Z0 /* PUBLIC.A.__SCAN_ */ INNER JOIN PUBLIC.B __Z1 /* PUBLIC."b_x_asc_y_asc_idx": Y = __Z0.Y AND X = __Z0.X */ ON 1=1 WHERE (__Z0.Y = __Z1.Y) AND (__Z0.X = __Z1.X) PLAN SELECT __C0_0 AS X, __C0_1 AS Y FROM PUBLIC.__T0 /* PUBLIC."merge_scan" */ 2 rows selected (0,007 seconds) ^ very fast, compared to 1,598 seconds before index was created My standing idea is that you have very low selectivity on b.x. I.e. if 10 million out of 14 million b rows will have x = 1, then index will not be able to help and will only hurt. Can you execute SELECT COUNT(*) FROM b WHERE x = 1; on your dataset? Regards, -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/