DynamoDB Scan vs Query на тех же данных

У меня есть вариант использования, когда мне нужно вернуть все элементы таблицы в Dynamo DB.

Предположим, в моей таблице есть ключ раздела (столбец X), имеющий одинаковое значение во всех строках, например, «монитор» и ключ сортировки (столбец Y) с отдельными элементами.

Будет ли разница во времени выполнения в приведенных ниже подходах или одинакова?

  1. Сканирование всей таблицы.
  2. Запрос данных на основе ключа раздела, имеющего «монитор».

person Himanshu Singhvi    schedule 06.09.2019    source источник


Ответы (3)


Вам следует использовать концепцию параллельного сканирования. Обычно вы выполняете несколько сканирований одновременно в разных сегментах таблицы. Однако следите за более высоким использованием RCU.

person Shaho    schedule 06.09.2019

По возможности избегайте использования сканирования.

Scan будет извлекать все строки из таблицы, вам также придется использовать разбиение на страницы для итерации по всем строкам. Это больше похоже на операцию select * from table; sql.

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

person Ankit Deshpande    schedule 06.09.2019

Прямой ответ

Насколько мне известно, в конкретном случае, который вы описываете, scan будет немного медленнее (особенно в первом ответе). Это когда предполагается, что вы не выполняете никакой фильтрации (т.е. FilterExpression пусто).

Дальнейшие мысли

DynamoDB потенциально может хранить огромные объемы данных. Под «огромным» я подразумеваю «больше, чем может поместиться в ОЗУ любой машины». Если вам нужно «вернуть все элементы таблицы», вы должны спросить себя: что произойдет, если эта таблица вырастет так, что все элементы больше не будут помещаться в памяти? вам не нужно заниматься этим прямо сейчас (я считаю, что на данный момент таблица довольно мала), но вам нужно помнить о возможности вернуться к этому коду и исправить его, чтобы он разрешил эту проблему.

вопросы, которые я бы задал себе, если бы был на вашем месте:

(1) могу ли я каким-то образом установить ограничение на количество элементов, которые мне нужно прочитать (скажем, читать только первые 1000 элементов)?

(2) как используется эта информация (список позиций)? отправляется ли он обратно в приложение JS, работающее внутри браузера, которое отображает его пользователю? если да, то что пользователь будет делать с огромным списком предметов?

(3) можете ли вы работать над элементами по одному (или 10 или 100 за раз)? если да, то вам нужно сохранить в памяти только один (или 10 или 100) элементов, но не весь список элементов.

В общем, в DDB scan операции используются, как описано в (3): читать один элемент (или несколько элементов) за раз, выполнять некоторую обработку и затем переходить к следующему элементу.

person Itay Maman    schedule 06.09.2019