How can I get the total number of items in a DynamoDB table?
Aha, there is a Count
option in the scan
API, see http://docs.amazonwebservices.com/AWSSDKforPHP/latest/#m=AmazonDynamoDB/scan
<?php
$dynamodb = new DynamoMetadata();
$scan_response = $dynamodb->scan(array(
'TableName' => 'ProductCatalog'
'Count' => true,
));
echo "Count: ".$scan_response->body->Count."\n";
The Count
option is definitely what you want, but you also have to take into account that there may be one or more "page" of results in your Scan result. The Scan operation only scans 1MB of data in your table at a time, so the value of Count
in the result is only going to reflect the count of the first 1MB of the table. You will need to make subsequent requests using the value of LastEvaluatedKey
in the result (if it is there). Here is some sample code for doing something like that:
<?php
$dynamo_db = new AmazonDynamoDB();
$total = 0;
$start_key = null;
$params = array(
'TableName' => 'my-table',
'Count' => true
);
do {
if ($start_key) {
$params['ExclusiveStartKey'] = $start_key->getArrayCopy();
}
$response = $dynamo_db->scan($params);
if ($response->isOK()) {
$total += (string) $response->body->Count;
if ($response->body->LastEvaluatedKey) {
$start_key = $response->body->LastEvaluatedKey->to_array();
} else {
$start_key = null;
}
}
} while ($start_key);
echo "Count: {$total}";
I can think of three options to get the total number of items in a DynamoDB table.
The first option is using the scan, but the scan function is inefficient and is in general a bad practice, especially for tables with heavy reads or production tables.
The second option is what was mention by Atharva:
A better solution that comes to my mind is to maintain the total number of item counts for such tables in a separate table, where each item will have Table name as it's hash key and total number of items in that table as it's non-key attribute. You can then keep this Table possibly named "TotalNumberOfItemsPerTable" updated by making atomic update operations to increment/decrement the total item count for a particular table.
The only problem this is that increment operations are not idempotent. So if a write fails or you write more than once this will be reflected in the count. If you need pin-point accuracy, use a conditional update instead.
The simplest solution is the DescribeTable which returns ItemCount. The only issue is that the count isn't up to date. The count is updated every 6 hours.
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html