Курсор запроса Apache Ignite getAll работает очень медленно

У меня 200 кешей загружены в одну область данных. Среди этого у меня есть customerCache с 300 КБ записей. Он имеет много индексированных полей, в том числе номер клиента.

Когда я запрашиваю с помощью SQLFieldsQuery этот конкретный кеш (где условие имеет только номер клиента =?), требуется около 280 мс, чтобы запросить клиент!

При детальном анализе я обнаружил, что SQLFieldQueryCursor.getAll () - это занимает 99% времени (получение экземпляра кеша и выполнение запроса завершение в диапазоне от наносекунды до 1 мс). Есть ли способ настроить cursor.getAll () или любой другой способ получить данные из курсора.

Больше информации

Я аннотировал номер клиента с помощью @Id, поэтому предполагая, что они были проиндексированы, и все запрошенные поля были аннотированы с помощью @QuerySqlField

Конфигурация кеша приведена ниже:

dataRegionCfg.setInitialSize(8L * 1024 * 1024 * 1024);
dataRegionCfg.setMaxSize(8L*1024*1024*1024);
dataRegionCfg.setPersistenceEnabled(false);
dataStorageCfg.setDataRegionConfigurations(dataRegionCfg);
dataStorageCfg.setPageSize(4096);
customerCacheConfig = new CacheConfiguration<>("customerCache");
customerCacheConfig.setIndexedTypes(CustomerKey.class, Customer.class);
customerCacheConfig.setReadThrough(false);
customerCacheConfig.setAtomicityMode(ATOMIC);
customerCacheConfig.setCacheMode(CacheMode.LOCAL);

Мой запрос был:

select customerName,customerId from CustomerMaster where customerNumber = ?;

Пожалуйста, дайте несколько советов по повышению производительности или дайте мне знать, если я что-то здесь не хватает.

Предоставьте точную конфигурацию кеша, включая индексы, а также полный исходный запрос во фрагменте.

alamar 29.05.2018 14:32

@alamar Я обновил вопрос, указав требуемые элементы.

Jikku Joyce 29.05.2018 15:24

Можете ли вы предоставить источники для CustomerKey и Customer? У меня есть сильное подозрение, что у вас на самом деле нет индекса на customerNumer, поскольку ваш ключ - CustomerKey, и вы должны объявить его с помощью @QuerySqlField(index=true).

alamar 29.05.2018 18:20

Можете ли вы также вставить полный вывод запроса EXPLAIN select customerName,customerId from CustomerMaster where customerNumber = ??

alamar 29.05.2018 18:20

В моем CustomerKey есть только поле UUID, и я не проиндексировал это поле. Но я проиндексировал свою модель клиента, у которой есть номер клиента. Должен ли я также проиндексировать поле ключевого класса?

Jikku Joyce 30.05.2018 08:07

Кроме того, cache.query () просто возвращает ссылки, а на самом деле результаты получаются в cursor.getAll ()?

Jikku Joyce 30.05.2018 08:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
199
1

Ответы 1

Спасибо Аламару за то, что указал правильный путь. Моя банка, развернутая на серверном узле, пропустила параметр index = true.

Также ignite не ожидает индексации в ключевом классе. Опять же, производительность не улучшится за счет увеличения числа или индексов, как у H2.

Другие вопросы по теме