2015-08-06 3 views
4

DynamoDBMapper предоставляет различные способы, чтобы прочитать один элемент из таблицы:DynamoDBMapper нагрузки против запроса

  • запрос
  • нагрузка

Есть рекомендации, какие из них использовать? В быстром тесте следующие два фрагмента кода возвращают один и тот же элемент «MyEntry» для таблицы с первичным ключом = хэш и ключ диапазона = дата, тогда как метод запроса примерно на 10% быстрее.

нагрузка

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) { 
    return mapper.load(MyEntry.class, hash, date); 
} 

запрос

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) { 
    final MyEntry hashKeyValues = new MyEntry(); 
    hashKeyValues.setHash(hash); 
    final Condition rangeKeyCondition = new Condition()// 
      .withComparisonOperator(ComparisonOperator.EQ.toString())// 
      .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date))); 
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()// 
      .withHashKeyValues(hashKeyValues)// 
      .withRangeKeyCondition("date", rangeKeyCondition)// 
      .withLimit(1); 
    final List<MyEntry> storedEntries = mapper 
      .query(MyEntry.class, queryExpression); 
    if (storedEntries.size() == 0) { 
     return null; 
    } 
    return storedEntries.get(0); 
} 
+0

* "Примерно 10% быстрее" *. Как вы оценили их? Каковы ваши измерения? – mkobit

+0

Я не правильно оценил, просто сделал измерение времени. Вставка с mapper.load заняла 90 мс с образцовой таблицей, та же самая вставка с mapper.query заняла 110 мс с той же таблицей. –

ответ

3

Хорошо, теперь, как я получаю больше привыкли работать с DynamoDB получается, что ошибка в коде mapper.query вызывает худшие характеристики:

  • «withLimit (1)» делает на самом деле не ограничивают общие результаты, возвращаемые в списке, но вместо этого результаты возвращаются в «PaginatedQueryList», и фактические элементы лениво загружаются из БД при доступе. WithLimit (1) фактически ограничивает элементы, загруженные с каждым запросом.
  • Фактическая ошибка - это часть «if (storedEntries.size() == 0)», поскольку вызов size() фактически загружает ВСЕ элементы в списке. С помощью функции withLimit (1) это приводит к наименее возможной производительности.

Правильный код для запроса картографа является:

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) { 
    final MyEntry hashKeyValues = new MyEntry(); 
    hashKeyValues.setHash(hash); 
    final Condition rangeKeyCondition = new Condition()// 
      .withComparisonOperator(ComparisonOperator.EQ.toString())// 
      .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date))); 
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()// 
      .withHashKeyValues(hashKeyValues)// 
      .withRangeKeyCondition("date", rangeKeyCondition)// 
      .withLimit(1); 
    final List<MyEntry> storedEntries = mapper 
      .query(MyEntry.class, queryExpression); 
    if (storedEntries.isEmpty()) { 
     return null; 
    } 
    return storedEntries.get(0); 
} 
3

нагрузки и запросов различные операции:

Если у вас есть хэш-ключ только схемы, которые они выполняют то же самое операция - извлечение элемента с помощью хеш-ключ.

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

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

Смежные вопросы