使用Apache Ignite和SQL进行过滤时CPU使用率高

问题描述 投票:0回答:1

我正面临使用SQL的Apache Ignite内存中缓存与CPU占用率高相关的问题。 where子句包含3个与“ =”匹配的列,并且所有这三列都已建立索引。这导致Intel i7上的所有8个内核都达到极限。我正在附加与导致高CPU使用率的线程相关的堆栈跟踪。在此堆栈跟踪中,64%的CPU花费在TableFilter.next()中,其余的花费在Select.isConditionMet()中-该表中的行数约为6000,需要根据返回的行数过滤并返回1行条件。为此构造了SqlFieldsQuery。该查询在应用程序中发生了数千次。这是否是Ignite SQL的错误用法,还是有些设置不正确?

尝试过以下选项:

  • 获取缓存时保持keepBinary()
  • 为所有列建立索引-要查找的三列中有2列具有高基数
  • 尝试惰性模式
  • 尝试从cache.query(cacheQuery).getAll();更改;使用单个next()来cache.query(cacheQuery).iterator()
  • 上述更改没有太大帮助。请帮助,我缺少什么吗?

enter image description here

添加复合索引(从H2控制台,我遇到以下异常)

javax.cache.CacheException: Failed to execute map query on remote node [nodeId=08fe1345-5b85-4a74-bb63-67cccf67b137, errMsg=Failed to parse SQL query: SELECT
__Z0.NORMALIZEDVALUE __C0_0
FROM "DM".DM __Z0
WHERE (__Z0.DN = 'countryOfTaxationMap') AND ((__Z0.VAL = 'KOR') AND ((__Z0.DS = 'trds') AND ((__Z0.RD = 'countryCodes') AND ((__Z0.STATUS = 'A')))))]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.fail(GridReduceQueryExecutor.java:290) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onFail(GridReduceQueryExecutor.java:280) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onMessage(GridReduceQueryExecutor.java:259) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.sendError(GridMapQueryExecutor.java:1198) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest0(GridMapQueryExecutor.java:1051) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest(GridMapQueryExecutor.java:705) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onMessage(GridMapQueryExecutor.java:240) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:170) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:168) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.util.lang.IgniteInClosure2X.apply(IgniteInClosure2X.java:38) ~[ignite-core-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.send(IgniteH2Indexing.java:3405) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.send(GridReduceQueryExecutor.java:1642) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:876) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$8.iterator(IgniteH2Indexing.java:1809) ~[ignite-indexing-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:95) ~[ignite-core-2.7.6.jar:2.7.6]
        at org.apache.ignite.internal.processors.cache.QueryCursorImpl.getAll(QueryCursorImpl.java:114) ~[ignite-core-2.7.6.jar:2.7.6]

我正面临使用SQL的Apache Ignite内存中缓存与CPU占用率高相关的问题。 where子句包含3个与“ =”匹配的列,并且所有这三列都已建立索引。这导致所有8 ...

java sql performance cpu-usage ignite
1个回答
0
投票

您的WHERE中有三个条件,但仅对其中一个条件使用索引。考虑创建复合索引(请注意,Ignite每个查询的每个表只能使用一个索引)。

© www.soinside.com 2019 - 2024. All rights reserved.