清除发电机数据库表而不指定任何键
Posted
技术标签:
【中文标题】清除发电机数据库表而不指定任何键【英文标题】:clear dynamo DB table without specifying any key 【发布时间】:2022-01-09 12:45:22 【问题描述】:我想截断最多可以有 300 万到 400 万条记录的 dynamodb 表。最好的方法是什么?
现在我正在使用性能不佳的扫描(我只尝试删除少数记录:3):
DynamoDB dynamoDB = new DynamoDB(amazonDynamoDBClient);
Table table = dynamoDB.getTable("table-test");
ItemCollection<ScanOutcome> resultItems = table.scan();
Iterator<Item> itemsItr = resultItems.iterator();
while(itemsItr.hasNext())
Item item = itemsItr.next();
String itemPk = (String) item.get("PK");
String itemSk = (String) item.get("SK");
DeleteItemSpec deleteItemSpec = new DeleteItemSpec().withPrimaryKey("PK", itemPk, "SK", itemSk);
table.deleteItem(deleteItemSpec);
【问题讨论】:
【参考方案1】:正如 Marcin 已经回答的那样,最好的方法是删除您的表并创建一个新表。这当然是最便宜的方式 - 因为任何其他方式都需要扫描整个表并支付所需的读取容量单位。
但是,在某些情况下,您可能希望在表仍在使用时删除旧项目。在这种情况下,您可以根据需要使用Scan
,但可以比您更有效地执行此操作:首先,不要按顺序运行单个DeleteItem
请求,等待一个删除完成后再请求下一个...您可以在一个 BatchWriteItem
请求中发送 25 个删除批次。您还可以并行发送多个BatchWriteItem
请求。最后,为了更快地删除,您可以将 Scan
并行化到多个线程甚至机器 - 请参阅 DynamoDB 文档的 parallel scan 部分。只是不要忘记,如果您在表仍在积极写入时删除项目,您需要一种方法来告诉您要删除的旧项目,以及您不想删除的新项目 - 因为扫描可能会开始也生产这些新产品。
最后,如果您发现自己经常从表中清除旧数据 - 您应该考虑是否可以使用 DynamoDB 的 TTL feature,其中 DynamoDB 会自动查找过期项目(基于每个项目的过期时间属性)并删除他们 - 您无需支付任何费用。
【讨论】:
【参考方案2】:最好的方法是删除您的表格,然后创建一个同名的新表格。这就是通常从 DynamoDB 中清除所有数据的方式。
【讨论】:
以上是关于清除发电机数据库表而不指定任何键的主要内容,如果未能解决你的问题,请参考以下文章