DynamoDB: когда применяется ограничение в 1 МБ для запросов - PullRequest
1 голос
/ 17 июня 2019

В документах для DynamoDB написано:

В операции Query DynamoDB извлекает элементы в отсортированном порядке, а затем обрабатывает элементы с использованием KeyConditionExpression и любых FilterExpression, которые могут присутствовать.

И

Одна операция Query может извлечь максимум 1 МБ данных. Это ограничение применяется до того, как FilterExpression применяется к результатам.

Означает ли это, что KeyConditionExpression применяется до этого предела в 1 МБ?

1 Ответ

3 голосов
/ 18 июня 2019

Действительно, ваша интерпретация верна.С KeyConditionExpression DynamoDB может эффективно извлекать только те данные, которые соответствуют его критериям, и вы платите только за эти совпадающие данные, а размер считывания 1 МБ применяется к совпадающим данным.Но с FilterExpression дело обстоит иначе: у DynamoDB нет эффективного способа отфильтровывать несоответствующие элементы до того, как на самом деле извлечь все из них , а затем отфильтровать ненужные элементы.Таким образом, вы платите за чтение всех нефильтрованных данных (до FilterExpression), а максимум в 1 МБ также соответствует нефильтрованным данным.

Если вы все еще не уверены, что именно такследует рассмотреть еще одну проблему: представьте, что у вас есть 1 гигабайт данных в вашей базе данных для сканирования (или в одном ключе для запроса), и после фильтрации результат составит всего 1 килобайт,Если вы сделаете этот запрос и рассчитываете получить 1 килобайт, Динамо должно будет прочитать и обработать весь 1 гигабайт данных перед возвратом.Это может занять очень много времени, и вы не будете знать, сколько, и, скорее всего, время ожидания в ожидании результата.Таким образом, вместо этого Dynamo возвращает вам данные после каждого 1 МБ данных, которые он читает с диска (и за которые вы платите ;-)).Контроль вернет вам 1000 (= 1 гигабайт / 1 МБ) раз во время длинного запроса, и у вас не будет шанса на тайм-аут.Имеет ли здесь смысл ограничение в 1 МБ, или это должно было быть больше, я не знаю, и, возможно, у нас должен был быть другой предел для размера ответа и объема чтения - но определенно был необходим некоторый предел для чтениясумма, даже если она не приводит к большим ответам.

Кстати, документация Scan включает немного отличающуюся от формулировки версию объяснения предела в 1 МБ, возможно, вы найдете его более понятным, чемверсия в документации Query:

Одна операция сканирования будет считывать до максимального количества установленных элементов (если используется параметр Limit) или максимум 1 МБ данных, а затем применятьлюбая фильтрация результатов с использованием FilterExpression.

...