Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在ApacheIgnite中提高查询性能_Performance_Ignite_Gridgain - Fatal编程技术网

Performance 如何在ApacheIgnite中提高查询性能

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

我已经设置了一个由两台服务器和一台客户端组成的ignite集群。 集群配置如下所示:

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");