[解決済み] DynamoDBから大量のアイテムを削除したいのですが、おすすめの方法はありますか?
質問
DynamoDBで簡単なロギングサービスを書いています。
私はuser_idハッシュとタイムスタンプ(Unixエポックint)範囲をキーとするlogsテーブルを持っています。
サービスのユーザーがアカウントを終了するとき、私は範囲の値に関係なく、テーブル内のすべてのアイテムを削除する必要があります。
このような操作を行うには、どのような方法が推奨されますか(削除する項目が数百万件になる可能性があることを念頭に置いてください)?
私が見た限りでは、選択肢は以下の通りです。
A: スキャン操作を実行し、返されたアイテムごとに、アイテムがなくなるまで削除を呼び出します。
B: BatchGetオペレーションを実行し、アイテムがなくなるまで各アイテムの削除を再度呼び出す
どちらも時間がかかるので、私には酷に見えます。
私が理想とするのは、LogTable.DeleteItem(user_id) - 範囲を指定せずに呼び出し、私のためにすべてを削除させることです。
どのように解決するのですか?
<ブロッククオート私が理想とするのは、LogTable.DeleteItem(user_id) - を呼び出すことです。 範囲を指定せずに、すべてを削除してくれます。
このような高度な操作は、AWSチームによって時間をかけて追加されるかもしれないと想像できます(彼らは最初に限られた機能セットから始めて、顧客のフィードバックに基づいて拡張を評価する歴史を持っています)。しかし、少なくともフルスキャンのコストを避けるために、ここであなたがすべきことは何でしょうか。
-
使用方法 クエリ よりも スキャン の全項目を取得するために
user_id
- これは、ハッシュと範囲を組み合わせた主キーが使われているかどうかに関係なく動作します。 ハッシュキー値 と RangeKeyCondition は本APIでは別のパラメータであり、前者が対象とするのは 複合主キーのハッシュコンポーネントの属性値。 .-
ここでは、通常通りクエリ API のページングを処理する必要があることに注意してください。
ExclusiveStartKey
パラメータを使用します。
以前のクエリの続きとなる項目の主キー。以前の 以前のクエリがLastEvaluatedKeyとして提供された場合、そのクエリはこの値を提供することがあります。 クエリ操作が完了する前に中断された場合。 結果セットのサイズまたは Limit パラメータが原因。この 新しいクエリリクエストでLastEvaluatedKeyを渡すと、そのクエリリクエストを継続することができます。 を使用することで、その時点からの操作を行うことができます。
-
ここでは、通常通りクエリ API のページングを処理する必要があることに注意してください。
ExclusiveStartKey
パラメータを使用します。
-
返されたすべての項目をループし、どちらかを促進する 項目削除 通常通り
- 更新情報 : 可能性が高い BatchWriteItem の方がこのような使用例には適しています(詳しくは以下をご覧ください)。
更新情報
で強調したように アイバント は、その BatchWriteItem 操作 を置くことができます。 または削除 1回のAPIコールで複数のテーブルにまたがる複数のアイテム [強調]。 :
1つのアイテムをアップロードするにはPutItem APIを、1つのアイテムを削除するには の場合、DeleteItem APIを使用することができます。しかし 大量のデータをアップロードしたり、削除したりする場合。 Amazon Elastic MapReduce (EMR)からのデータ移行や、他のアプリケーションからのデータ移 このAPIは、Amazon DynamoDBにデータベースを導入するための効率的な方法を提供します。 の代替となります。
なお、これにはまだいくつかの関連する制限があります。
-
1回のリクエストで可能な最大操作 - putまたはdelete操作は合計25個まで指定できます。ただし、リクエストの合計サイズは1MB(HTTPペイロード)を超えることはできません。
-
アトミック操作ではありません - BatchWriteItemで指定された個々の操作はアトミックですが、BatchWriteItemは全体として"best-effort"操作であり、アトミック操作ではありません。つまり、BatchWriteItemのリクエストの中で、ある操作は成功するかもしれないし、ある操作は失敗するかもしれない。[...]
しかし、このことは、今回のようなユースケースにおいて、明らかに大きな利益をもたらす可能性があります。
関連
-
親行が削除または更新できない: 外部キー制約に失敗 解決策
-
2021MySql-8.0.26インストール詳細チュートリアル(ベビーシッターレベル)
-
01. プロシージャの結果セットを持つ一時テーブルへのSELECT INTO
-
は、GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
db2 エラー sqlcode=-420 自動型変換問題
-
redisサーバーに接続するとプロンプトが表示されます。Redis Client On Error: Error: connect ECONNREFUSED 127.0.0.1:6380 設定はあってる?
-
[c3p0] Error: c3p0プールの初期化中... ComboPooledDataSource [ acquireIncrement...
-
MySQL cumsum(累積)の実装
-
DB2v10.5Express-Cのインストール
-
データファイルのsqlldrフィールドが最大長を超えています。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
2021MySql-8.0.26インストール詳細チュートリアル(ベビーシッターレベル)
-
unixODBC:データソース名が見つからない、デフォルトドライバが指定されていないに関する質問
-
01. プロシージャの結果セットを持つ一時テーブルへのSELECT INTO
-
MongoDBコマンド
-
mysql import error [Err] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'.
-
mysql: この操作には (少なくとも 1 つの) RELOAD 権限が必要です。
-
PostgreSQLのエラー[ERROR: relation "xxxx" does not exist]を解決する。
-
[解決済み] 全レコードを返すElasticsearchクエリ
-
[解決済み] アプリケーション開発者が陥りやすいデータベース開発の失敗例【終了しました
-
C#でExcelを読み込むとエラーが発生します。外部テーブルが期待された形式ではありません。