Performance 如何在ApacheIgnite中提高查询性能
我已经设置了一个由两台服务器和一台客户端组成的ignite集群。 集群配置如下所示:Performance 如何在ApacheIgnite中提高查询性能,performance,ignite,gridgain,Performance,Ignite,Gridgain,我已经设置了一个由两台服务器和一台客户端组成的ignite集群。 集群配置如下所示: IgniteConfiguration icfg = new IgniteConfiguration(); icfg.setIncludeEventTypes(EventType.EVT_TASK_STARTED,EventType.EVT_TASK_FINISHED,EventType.EVT_TASK_FAILED); icfg.setMetricsUpdateFrequency(-1); Ignit
IgniteConfiguration icfg = new IgniteConfiguration();
icfg.setIncludeEventTypes(EventType.EVT_TASK_STARTED,EventType.EVT_TASK_FINISHED,EventType.EVT_TASK_FAILED);
icfg.setMetricsUpdateFrequency(-1);
Ignite ignite = Ignition.start(icfg);
我禁用了度量更新频率,只启用了Ignite文档性能提示部分中建议的一些事件通知
我已使用以下配置在群集中创建了缓存:
CacheConfiguration<Integer,DataPOJO> cacheConfiguration = new CacheConfiguration<>();
cacheConfiguration.setStatisticsEnabled(false);
cacheConfiguration.setName("testCache");
我不想使用java.io.Serializable,因为它会影响性能。我在两个字段上创建了索引,即primaryKey和stringField4
字段stringField4将是每个条目的字段primaryKey的字符串表示形式。
如果primaryKey=1,则stringField4=1
primaryKey也是缓存中任意项的密钥
我从客户端执行的查询是基于stringField4字段的10000个值从缓存中获取10000个条目。
查询如下:
IgniteCache<Integer,DataPOJO> testCache= ignite.getOrCreateCache("testCache");
SqlQuery<Integer,DataPOJO> query = new SqlQuery<>(DataPOJO.class,"stringField4 = ?");
long startTime,totalTimeElapsed = 0;
QueryCursor<Entry<Integer,DataPOJO>> cursor;
for(int i=1;i<=10000;i++){
startTime = System.nanoTime();
cursor = testCache.query(query.setArgs(i));
for(Entry<Integer,DataPOJO> entry : cursor){
System.out.println("Entry fetched with key "+entry.getKey());
totalTimeElapsed += System.nanoTime() - startTime;
}
}
System.out.println("Total time taken to execute query is "+totalTimeElapsed+"ns");
执行所有查询平均需要9到10秒
根据给定的数据,Ignite能否在100到200毫秒内给出相同的结果?除了Ignite文档中提到的配置之外,我可以在集群或缓存配置中进行其他配置吗?我已经尝试了所有这些配置来提高性能
我不希望这是一个基于键的获取,我知道它比查询快得多。如果使用索引,它应该快得多。我建议运行EXPLAIN并检查执行计划。我也面临同样的问题,比如查询无限运行。所以,我将使用正确的索引在几秒钟内运行查询,所以请检查您的查询解释计划,并检查查询执行计划中是否有任何完整的缓存扫描,如果您看到了,请放置适当的单个或分组索引。如果你能分享你的一个查询和它的解释计划,那么我们可以给你关于它的想法 感谢您的快速回复@Valentin。我已经设置了索引类型,其中一个查询的h2计划如下:[[选择DATAPOJO.\u KEY AS\uuuuuc0,DATAPOJO.\u VAL AS\uuuuc1,DATAPOJO.PRIMARYKEY AS\uuuc2,DATAPOJO.FOREIGNKEY1 AS\uuuc3,DATAPOJO.FOREIGNKEY2 AS\uuuc4,DATAPOJO.STRINGFIELD1 AS\uuuc5,DATAPOJO.STRINGFIELD2 AS\uuc6,DATAPOJO.STRINGFIELD3 AS\uuuuc7,DATAPOJO.DATEFIELD AS\uc8,DATAPOJO.STRINGFIELD4 AS\datuc9APOJO/*cache1.stringField4_idx:stringField4=?1*/其中stringField4=?1],[从PUBLIC中选择uuuc0作为u键,uuuc1作为u VAL,uuuc2作为主键,uuuc3作为外键1,uuc4作为外键2,uuuc5作为STRINGFIELD1,uuuc6作为STRINGFIELD2,uuuuuuuc7作为STRINGFIELD3,uuuuuuuc8作为日期字段,uuuuuc9作为STRINGFIELD4。uuuu T0/*cache1.merge\u scan*/]抱歉,有多条注释。整个计划不适合一条注释。看起来它正在使用查询执行计划中的索引。能否在GitHub上创建一个小项目,以便我可以运行和复制该行为?我已在@Valentin的注释中共享了解释计划,并在我的question@AnikethJain你能和我分享一下吗ry soo我们可以为您提供索引帮助请参见我的问题,其中第三部分包含查询。总之,这里是查询:SqlQuery query=new SqlQueryDataPOJO.class,stringField4=?;我使用了注释并设置了索引类型,而且H2执行计划显示查询正在使用索引。您能看到我的代码和电话吗我能做些什么改变?
IgniteCache<Integer,DataPOJO> testCache= ignite.getOrCreateCache("testCache");
SqlQuery<Integer,DataPOJO> query = new SqlQuery<>(DataPOJO.class,"stringField4 = ?");
long startTime,totalTimeElapsed = 0;
QueryCursor<Entry<Integer,DataPOJO>> cursor;
for(int i=1;i<=10000;i++){
startTime = System.nanoTime();
cursor = testCache.query(query.setArgs(i));
for(Entry<Integer,DataPOJO> entry : cursor){
System.out.println("Entry fetched with key "+entry.getKey());
totalTimeElapsed += System.nanoTime() - startTime;
}
}
System.out.println("Total time taken to execute query is "+totalTimeElapsed+"ns");