Amazon DynamoDB基于分区键删除数据



我试图使用分区键和排序键删除DynamoDB表中的多条记录。这种方法需要花费大量的时间来删除记录。我遵循下面的方法使用Java aws SDK库实现。

public static ItemCollection<QueryOutcome> getKeyDataFromTable(String tableName, HashMap<String, String> keyValue){
QuerySpec spec = null;
//Connect to Database Table
spec = new QuerySpec().withKeyConditionExpression("pKey" =:v_id").withValueMap(new ValueMap().withString(":v_id",keyValue.get("partitionkey")));
ItemCollection<QueryOutcome> items = table.query(spec);
} 

public void deleteItems(){
String tableName="tableName";
String partitionKey="partitionKey";
HashMap<String, String> keyValue = new HashMap<>();
keyValue.put("partitionKey",partitionKey);
ItemCollection<QueryOutCome> keyDataFromTable = getKeyDataFromTable(tableName,keyValue);
IteratorSupport<QueryOutcome> iterator = keyDataFromTable.iterator();
Item item=null;
List<String> sortKeyList = new ArrayList<>();
while(iterator.hasNext()){
item=iterator.next();
sortKeyList.add((String) item.get("sortKey"));
}
for(String skey:ortKeyList){
DeleteItemSpec deleteItemSpec = new DeleteItemSpec().withPrimaryKey("partitionKey","partitionKey","sortKey","sortKey");
table.deleteItem(deleteItemSpec);

}
}

是否有任何正确的方法来动态地实现更好的性能?

不幸的是,DynamoDB没有用于删除整个分区(即共享特定分区键的所有项)的API。我说的是"不幸的"因为其他类似的nosql数据库,如Cassandra或Scylla,确实有这种删除整个分区的能力,但DynamoDB从未实现过。

因此,正如您注意到的,您别无选择,只能使用Query来检索该分区中的排序键列表,然后逐个删除它们。

你可以优化这个操作:

  1. 您可以要求Query只返回每个项的排序键,而不是返回整个项。

    这可以节省您的网络带宽和客户端工作,但不会为您节省任何钱-Query的成本取决于项目的全部尺寸,而不是它返回的部分。这并不是一个问题,因为无论如何,删除的成本将明显高于查询的成本(删除计算为写入,其成本最多是读取的40倍)。

  2. 您可以并行地发送多个删除,而不是顺序地发送单个DeleteItem请求,因为请求延迟非常慢(您总是在开始下一个删除之前等待一个删除完成)。您可以在客户端中执行此操作,或者使用更好的方法—使用服务器的BatchWriteItem,它可以一次调用多达100次删除。这真的可以加快你的删除。

这个问题在stackoverflow上被问过很多次,你可以找到很多示例代码。这里有一个例子:如何删除记录在亚马逊Dynamodb基于哈希键?

最新更新