Высокая загрузка ЦП при фильтрации с использованием Apache Ignite и SQL - PullRequest
0 голосов
/ 28 февраля 2020

Я сталкиваюсь с проблемой высокой загрузки ЦП при Apache Зажигать кэширование в памяти с помощью SQL. Где предложение содержит 3 столбца с соответствием "=" и все три столбца проиндексированы. Это приводит к тому, что все 8 ядер на Intel i7 работают с максимальной скоростью. Я прилагаю трассировку стека, связанную с потоками, вызывающими высокую загрузку ЦП. В рамках этой трассировки стека 64% ЦП тратится в TableFilter.next (), а остальные в Select.isConditionMet () - количество строк в этой таблице составляет около 6000, и 1 строка должна быть отфильтрована и возвращена на основе состояние. SqlFieldsQuery построен для этой цели. Этот поиск происходит тысячи раз из приложения. Это неправильное использование Ignite SQL или есть что-то, что неправильно настроено?

Пробовал следующие опции:

  • keepBinary () при получении кеша
  • Индексируются все столбцы - 2 из трех просматриваемых столбцов имеют большую мощность
  • Пробный ленивый режим
  • Попытка изменения из cache.query (cacheQuery) .getAll (); to cache.query (cacheQuery) .iterator () с помощью функции next ()

Вышеуказанные изменения не сильно помогли. Пожалуйста, помогите, я что-то упустил?

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]

1 Ответ

2 голосов
/ 02 марта 2020

В вашем WHERE есть три условия, но индекс используется только для одного из них. Рассмотрите возможность создания составного индекса (обратите внимание, что Ignite может использовать только один индекс для таблицы на запрос).

...