Время получения объектов из хранилища данных

У меня есть приложение App Engine, которое использует Datastore. Один из видов в хранилище данных содержит более 2 000 000 объектов. Запросы такого рода чрезвычайно медленны. Например, запрос, который возвращает около 50 объектов, занимает 3 - 5 секунд. Я не знаю, имеет ли значение количество фильтров, но в этом случае я устанавливаю 7 фильтров по запросу. На мой взгляд, запросы на другие виды тоже медленны. Например, запрос, возвращающий около 20 объектов из вида, который содержит более 90 000 объектов, занимает около 1 секунды.

Я строю составные индексы для этих запросов, но это не очень помогает. Изменение размера куска и использование только запросов на клавиши не помогают.

Что имеет наибольшее влияние на время выполнения запросов к хранилищу данных? Есть ли способ ускорить мои запросы?

Способ, которым я получаю объекты, аналогичен примеру, который я нашел в документации:

Query q = new Query("Person").setFilter(heightRangeFilter);

 PreparedQuery pq = datastore.prepare(q);

 for (Entity result : pq.asIterable()) {

 String firstName = result.getProperty("firstName").toString();
 String lastName = result.getProperty("lastName").toString();
 Long height = (Long) result.getProperty("height");

 }

Общий размер этих объектов составляет 423,33 МБ, встроенные индексы: 2,87 ГБ, составные индексы: 1,85 ГБ

Я использую класс Logger для регистрации диагностической информации. Разница во времени между двумя журналами, которые я вижу в консоли администратора. Когда я помещаю журнал в первую и последнюю строку цикла, который итерации через сущности, я вижу странные паузы между итерациями. Я понятия не имею, в чем причина.

Пример: 15: 06: 30,565 Начало 15: 06: 30.566 Стоп 15: 06: 30,566 Начало 15: 06: 30.566 Стоп 15: 06: 30,572 Начало 15: 06: 30.572 Стоп 15: 06: 30,583 Начало 15: 06: 30,583 Стоп 15: 06: 30,595 Начало 15: 06: 30,595 Стоп 15: 06: 30,595 Начало 15: 06: 30,595 Стоп 15: 06: 30,595 Начало 15: 06: 30,596 Стоп 15: 06: 30.658 Начало 15: 06: 30.658 Стоп 15: 06: 30,659 Начало 15: 06: 30.659 Стоп 15: 06: 30,666 Начало 15: 06: 30,666 Стоп ...

EDIT: я изменил свой запрос на использование 6 фильтров и построил для него новый составной индекс. Кажется, что он быстрее, но он работает еще более 2 секунд при извлечении около 100 объектов. Способ создания фильтров аналогичен примеру из документации:

Filter timeMinFilter =
 new FilterPredicate("time",
 FilterOperator.GREATER_THAN_OR_EQUAL,
 startTime);

Filter timeMaxFilter =
 new FilterPredicate("time",
 FilterOperator.LESS_THAN_OR_EQUAL,
 stopTime);

Filter heightRangeFilter = CompositeFilterOperator.and(timeMinFilter, timeMaxFilter);

Имеет ли значение, что я установил FilterOperator.GREATER_THAN_OR_EQUAL и FilterOperator.LESS_THAN на свойство string?

Спасибо за помощь.

1 ответ

Скорость запросов в App Engine не зависит от количества объектов, хранящихся в хранилище данных. Это зависит только от количества и размера объектов, которые вы извлекаете из своего запроса.

Время запроса, которое вы указали, указывает на то, что существует проблема с тем, как вы извлекаете эти объекты. Это может быть проблемой в коде, используемом для запуска запросов, или это может быть проблема с созданием сущностей. Невозможно углубиться в информацию, которую вы предоставили в своем вопросе.

ОБНОВИТЬ:

Попытайтесь использовать этот код вместо этого и посмотрите, видите ли вы улучшение:

for (Entity result : pq.asList(FetchOptions.Builder.withDefaults().chunkSize(100).prefetchSize(100)) {

Вы должны использовать эту строку каждый раз, когда вы ожидаете более 10 результатов в своем запросе. Обратите внимание, что число может быть где угодно между 0 и 1000, поэтому вы можете попробовать разные лимиты для разных запросов, чтобы увидеть, что лучше всего работает.

licensed under cc by-sa 3.0 with attribution.