#database #amazon-web-services #amazon-dynamodb
#База данных #amazon-веб-сервисы #amazon-dynamodb
Вопрос:
У меня возникли некоторые проблемы с оптимизацией DynamoDB. Я считаю, что мне не нужно показывать здесь какой-либо код, поэтому я просто задаю свой вопрос,
У моих элементов есть атрибут «список». Что мне нужно сделать, это повторить эту таблицу, добавить новые значения в атрибут списка каждого элемента. Поскольку каждая операция обновления отличается друг от друга, для этой операции требуется много единиц записи. Чтобы уменьшить это, я группирую элементы по 25 и обновляю их с помощью TransactionWriteItem. Я не мог точно сравнить значения, но чувствовал, что это не имеет никакого эффекта.
У меня также есть еще один вопрос: если мои данные составляют 100 байт (меньше 4 КБ), будет ли какая-то разница, если я их заархивирую? Я имею в виду, есть ли разница между 100 байтами и 10 байтами с точки зрения потребляемых единиц записи? Спасибо.
Комментарии:
1. Ну, я только что узнал, что updateItem работает ужасно. При вычислении WCU используется весь размер элемента, поэтому не имеет значения, добавляю ли я крошечные данные к атрибуту или переписываю весь элемент. Это расстраивает.
Ответ №1:
API транзакций не предназначен для ускорения работы или использования меньшей емкости: он предназначен для разрешения атомарных операций с несколькими элементами (это означает, что либо все обновления завершаются успешно, либо все завершаются неудачей, как единое целое).
Сравните это с выполнением 25 обновлений самостоятельно или с использованием API BatchWriteItem — в этих случаях некоторые обновления могут завершиться неудачей, в то время как другие будут успешными. Или все они могут быть успешными, но при обновлении ваших элементов могут произойти другие чтения, что приведет к противоречивым представлениям о ваших данных.
Итак, чтобы лучше понять потребляемую емкость записи, это выглядит следующим образом: любой обновляемый элемент (включая создание нового, удаление существующего или обновление существующего) будет потреблять не менее 1 единицы емкости. Обновление элемента не может использовать дробные единицы емкости (т.Е. если ваши обновления действительно крошечные). Но одно обновление элемента может потреблять более 1 WCU, если элемент больше 1 КБ.
Таким образом, сжатие ваших элементов окупается, если они большие (er), чем 1 КБ.
На самом деле, даже если размер меньше 1 КБ, стоит стремиться к небольшим элементам, потому что в отличие от операций записи, которые всегда занимают не менее 1 КБ, при запросе или сканировании потребляемая емкость вычисляется для совокупной суммы возвращенных результатов запроса или сканирования. Например, если ваш запрос извлекает 10 элементов, и каждый элемент равен 200B, вам будет начислен только 1 RCU; но если тот же запрос возвращает 10 элементов, и каждый элемент равен 1 КБ, тогда вы потребите 3RCU (10 КБ / 4 КБ = 2,5, округлено до 3)
Комментарии:
1. Спасибо, могу я также спросить, какова наилучшая практика для обновления элемента? В моем случае я добавляю в список очень маленький объект, но емкость записи рассчитывается на основе размера всего элемента. Что мне делать, если я хочу добавить 50 байт к элементу размером 300 КБ? Должен ли я оплачивать объем записи в 300 КБ?