DynamoDB - сканирование
Операции сканирования читают все элементы таблицы или вторичные индексы. Его функция по умолчанию приводит к возврату всех атрибутов данных всех элементов в индексе или таблице. ИспользоватьProjectionExpression параметр в атрибутах фильтрации.
Каждое сканирование возвращает набор результатов, даже если совпадений не найдено, что приводит к пустому набору. Сканирование извлекает не более 1 МБ с возможностью фильтрации данных.
Note - Параметры и фильтрация сканирований также применяются к запросам.
Типы операций сканирования
Filtering- Операции сканирования предлагают тонкую фильтрацию с помощью выражений фильтров, которые изменяют данные после сканирования или запросов; перед возвратом результатов. В выражениях используются операторы сравнения. Их синтаксис напоминает выражения условий, за исключением ключевых атрибутов, которые выражения фильтра не допускают. В выражении фильтра нельзя использовать ключ раздела или сортировки.
Note - Ограничение в 1 МБ применяется до любого применения фильтрации.
Throughput Specifications- Сканирование потребляет пропускную способность, однако при этом учитывается размер элемента, а не возвращаемые данные. Потребление остается неизменным независимо от того, запрашиваете ли вы каждый атрибут или только несколько, и использование или неиспользование выражения фильтра также не влияет на потребление.
Pagination- DynamoDB разбивает результаты на страницы, вызывая разделение результатов на определенные страницы. Ограничение в 1 МБ применяется к возвращаемым результатам, и когда вы его превышаете, для сбора остальных данных требуется еще одно сканирование. ВLastEvaluatedKeyзначение позволяет вам выполнить это последующее сканирование. Просто примените значение кExclusiveStartkey. КогдаLastEvaluatedKeyзначение становится нулевым, операция завершила все страницы данных. Однако ненулевое значение не означает, что автоматически остается больше данных. Только нулевое значение указывает на статус.
The Limit Parameter- Параметр limit управляет размером результата. DynamoDB использует его для определения количества элементов для обработки перед возвратом данных и не работает за пределами области. Если вы установите значение x, DynamoDB вернет первые x совпадающих элементов.
Значение LastEvaluatedKey также применяется в случаях, когда параметры ограничения дают частичные результаты. Используйте его для завершения сканирования.
Result Count - Ответы на запросы и сканирование также включают информацию, относящуюся к ScannedCountи Count, которые определяют количество отсканированных / запрошенных элементов и количество возвращенных элементов. Если не фильтровать, их значения идентичны. Когда вы превышаете 1 МБ, счетчики представляют только обработанную часть.
Consistency- Результаты запроса и результаты сканирования в конечном итоге являются согласованными чтениями, однако вы также можете установить строго согласованные чтения. ИспользоватьConsistentRead параметр, чтобы изменить эту настройку.
Note - Параметры согласованного чтения влияют на потребление за счет использования удвоенных единиц емкости, когда установлено строго согласованное значение.
Performance- Запросы обеспечивают лучшую производительность, чем сканирование, так как сканирование сканирует всю таблицу или вторичный индекс, что приводит к медленному отклику и высокому потреблению пропускной способности. Сканирование лучше всего работает для небольших таблиц и поиска с меньшим количеством фильтров, однако вы можете разработать экономичное сканирование, следуя нескольким передовым практикам, например, избегая внезапных ускоренных операций чтения и используя параллельное сканирование.
Запрос находит определенный диапазон ключей, удовлетворяющих заданному условию, при этом производительность определяется объемом извлекаемых данных, а не объемом ключей. Параметры операции и количество совпадений особенно влияют на производительность.
Параллельное сканирование
По умолчанию операции сканирования выполняют обработку последовательно. Затем они возвращают данные частями по 1 МБ, что побуждает приложение выбрать следующую порцию. Это приводит к долгому сканированию больших таблиц и индексов.
Эта характеристика также означает, что сканирование не всегда может полностью использовать доступную пропускную способность. DynamoDB распределяет данные таблицы по нескольким разделам; и пропускная способность сканирования остается ограничена одним разделом из-за его работы с одним разделом.
Решение этой проблемы можно найти в логическом разделении таблиц или индексов на сегменты. Затем «рабочие» параллельно (одновременно) просматривают сегменты. Он использует параметры Segment иTotalSegments указать сегменты, просканированные определенными воркерами, и указать общее количество обрабатываемых сегментов.
Номер рабочего
Вы должны поэкспериментировать с рабочими значениями (параметр сегмента), чтобы добиться наилучшей производительности приложения.
Note- Параллельное сканирование с большим набором рабочих влияет на пропускную способность, возможно, потребляя всю пропускную способность. Решите эту проблему с помощью параметра Limit, который можно использовать, чтобы запретить одному работнику использовать всю пропускную способность.
Ниже приведен пример глубокого сканирования.
Note- Следующая программа может предполагать ранее созданный источник данных. Перед попыткой выполнения приобретите вспомогательные библиотеки и создайте необходимые источники данных (таблицы с требуемыми характеристиками или другие источники, на которые есть ссылки).
В этом примере также используется Eclipse IDE, файл учетных данных AWS и AWS Toolkit в рамках проекта Eclipse AWS Java.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
public class ScanOpSample {
static DynamoDB dynamoDB = new DynamoDB(
new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
static String tableName = "ProductList";
public static void main(String[] args) throws Exception {
findProductsUnderOneHun(); //finds products under 100 dollars
}
private static void findProductsUnderOneHun() {
Table table = dynamoDB.getTable(tableName);
Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":pr", 100);
ItemCollection<ScanOutcome> items = table.scan (
"Price < :pr", //FilterExpression
"ID, Nomenclature, ProductCategory, Price", //ProjectionExpression
null, //No ExpressionAttributeNames
expressionAttributeValues);
System.out.println("Scanned " + tableName + " to find items under $100.");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
}