@李玉珏 你好,想跟你请教个问题:目前在使用Ignite的过程中发现使用Ignite的cache.query中时如果sql语句如下
select p.name, all.java,all.ignite
from ( select s.pid ida,
sum ( case when c.name ='java' then s.score else 0 end) java,
sum ( case when c.name = 'ignite' then s.score else 0 end ) ignite
from "test".score s , "test".course c
where s.cid=c.id
group by ida )
all right outer join "test".person p
on all.ida=p.id
会发生死循环,无法查询到结果(想类似连接查询存在这种问题),请问你遇到过类似的问题吗,还有您对Ignite支持的sql查询有什么其他深入的了解,比如Ignite对sql的查询支持到什么程度?如果说把所有相关的业务计算逻辑用sql通过ignite的查询来实现,您认为合理吗?还是说复杂的计算逻辑按照mapreduce的方式实现比较好?
上面的sql用到的表结构
public class Person {
private Integer id;
private String name;
private String address;
private String phone;
private Integer age;
}
public class Course {
private Integer id;
private String name;
}
public class Score {
private Integer id;
private Integer pid;
private Integer cid;
private Integer score;
}
1.你数据量多大?
2.你这个SQL应该是写复杂了,我觉得应该能简化。
3.只要不报错,说明你这个语法是支持的。
4.虽然可以将Ignite作为分布式内存数据库用,但是显然有很多的条件,否则要么得不到正确的结果,要么性能很差。
目前测试数据量只有1万,上面的语法没有错误,这已经是最简化的了,再简化就只能拆开查询了,上面的sql在h2 ConsoleWeb客户端可以查出结果,但是在Ignite中用cache.query就无法查出结果,通过debug发现在GridH2IndexBase中的1214行函数awaitForResponse中一直在死循环,如果将上面的sql语句中的子查询中的right out join 改为left out join在h2 Web客户端和用cache.query都可以查出来
忘了说明了上面的sql是在单节点setDistributedJoins(true)的情况下查询的