Подтвердить что ты не робот

Какая разница между BatchGetItem и Query в DynamoDB?

Я проходил через документы AWS DynamoDB и, в течение всей моей жизни, не мог понять, в чем основное отличие между batchGetItem() и Query(). Оба извлекают элементы на основе первичных ключей из таблиц и индексов. Единственное различие заключается в размере найденных предметов, но это не похоже на разницу в разрыве. Оба они также поддерживают условные обновления.

В каких случаях я должен использовать batchGetItem над Query и наоборот?

4b9b3361

Ответ 1

В двух словах: BatchGetItem работает с таблицами и использует хеш-ключ для идентификации элементов, которые вы хотите получить. Вы можете получить до 16 МБ или 100 элементов в ответе

Query работает с таблицами, локальными вторичными индексами и глобальными вторичными индексами. В ответе вы можете получить не более 1 МБ данных. Самое большое различие заключается в том, что выражения запроса поддержки запросов, что означает, что вы можете запрашивать данные, а DDB будет фильтровать его на стороне сервера для вас.

Возможно, вы, возможно, достигнете того же самого, если хотите, чтобы вы использовали любой из них, если вы действительно этого хотите, но правило большого пальца - вы делаете BatchGet, когда вам нужно выгружать материал из DDB, и вы запрашиваете, когда вам нужно сузить вниз, что вы хотите получить (и вы хотите, чтобы динамо выполняло тяжелую лифтинговую фильтрацию данных для вас).

Ответ 2

Согласно официальной документации: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations

Для BatchGetItem каждый элемент в партии считывается отдельно, поэтому DynamoDB сначала округляет размер каждого элемента до следующего 4 КБ, а затем вычисляет общий размер. Результат не обязательно совпадает с общим размером всех элементов. Например, если BatchGetItem считывает элемент 1.5 KB и элемент 6.5 KB, DynamoDB будет вычислять размер как 12 КБ (4 КБ + 8 КБ), а не 8 КБ (1,5 КБ + 6,5 КБ).

Для запроса все возвращаемые элементы рассматриваются как одна операция чтения. В результате DynamoDB вычисляет общий размер всех элементов, а затем округляет до следующей границы 4 КБ. Например, предположим, что ваш запрос возвращает 10 элементов, общий размер которых составляет 40,8 КБ. DynamoDB округляет размер элемента для операции до 44 КБ. Если запрос возвращает 1500 элементов по 64 байта каждый, кумулятивный размер составляет 96 КБ.

Итак, вы должны использовать BatchGetItem только в том случае, если ваши элементы относительно большие (так что округление 4KB мало влияет), и вам нужно получить > 1 МБ за один вызов.

В любой другой ситуации используйте Query, иначе вы в конечном итоге будете платить гораздо больше за ничего;)

Ответ 3

Существует важное различие, которое отсутствует в других ответах:

  • Для запроса требуется ключ раздела
  • BatchGetItems требует первичного ключа

Запрос полезен только в том случае, если элементы, которые вы хотите получить, имеют общий ключ (хэш), и вы должны указать это значение. Кроме того, вы должны предоставить точное значение; Вы не можете выполнить частичное сопоставление с ключом раздела. Оттуда вы можете указать дополнительное (и, возможно, частичное/условное) значение для ключа сортировки, чтобы уменьшить объем считываемых данных и еще больше уменьшить вывод с помощью выражения FilterExpression. Это здорово, но у него есть большое ограничение: вы не можете получать данные, которые находятся за пределами одного раздела.

BatchGetItems является оборотной стороной этого. Вы можете получать данные по многим разделам (и даже по нескольким таблицам), но вы должны знать полный и точный первичный ключ: то есть и ключ раздела (хеш) и любой вид (диапазон). Это буквально похоже на вызов GetItem несколько раз за одну операцию. У вас нет опций частичного поиска и фильтрации в Query, но вы не ограничены одним разделом.