DynamoDB に触ったこともない人間が
KeyConditionExpression と FilterExpression の違いで詰まったのでメモとして残しておきます
結論
- KeyConditionExpression
→ パーティションキー or ソートキー の属性にのみ使用できる - FilterExpression
→ パーティションキー or ソートキー でない属性(非キー属性)にのみ使用できる - FilterExpression の方がだいぶいろいろできる
詳細
1. そもそも何に使うものか
KeyConditionExpression も FilterExpression も
DynamoDB のテーブル中から項目を検索する( Query
を投げる)ときに使います
厳密には
- KeyConditionExpression を使用して、DynamoDBテーブルにクエリを投げる
- 1 の結果に対して FilterExpression を適用し、結果を返す
という流れのようです
詳細はこちら
2. 2つの違いはなにか
自分が理解している範囲で大きく3つあります
- 使用できる属性の違い
- 使用できる演算子の違い
- 読み込みキャパシティー消費の有無
違い1:使用できる属性の違い
結論で述べたとおり
- KeyConditionExpression
→ パーティションキー or ソートキー の属性にのみ使用できる - FilterExpression
→ パーティションキー or ソートキー でない属性(非キー属性)にのみ使用できる
違い2:使用できる演算子の違い
FilterExpression の方が大分幅広いです
KeyConditionExpression
ざっくり
- 等しいかどうか
- 大小関係
- 指定した範囲に収まるかどうか
- 特定の文字列から始まるかどうか
かつ、仕様できる演算子は属性につき1つです
FilterExpression
KeyConditionExpression の演算子に加えて
- 指定したリスト内の値に含まれるか
- 指定した値でないかどうか
などいろいろできます
違い3:読み込みキャパシティー消費の有無
DynamoDB の料金体系にかかわるのは
- キャパシティーユニット
- データストレージ(保存容量)
- データ転送
- その他オプション
読み込みキャパシティは
DynamoDB に保存されているデータの大きさ(返す結果の大きさではなく)
をもとに消費されるらしく、
つまり DynamoDB からデータを引っ張ってこようとすると
KeyConditionExpression の有無にかかわらずキャパシティーを消費するようです
対して、FilterExpression の方は Query
完了後に適用されるので、
FilterExpression があってもなくても読み込みキャパシティーが消費されるということはないようです
ちなみに
では、KeyConditionExpression を設定せずに FilterExpression だけで何とかすればいいのでは?とも思ったのですが、
Query
はパーティションキーの指定が必須らしいので FilterExpression だけというのは不可能のようです
気になっている点
- できるだけ KeyConditionExpression を使用し、FilterExpression は最小限
- できるだけ KeyConditionExpression は使用せず、FilterExpression を多用
(それが可能なテーブル構造であるという前提)
この場合、
読み込みキャパシティ的には変わらない(つまり料金的には変わらない)様なのですが、
速度とかどうなんでしょうか?(次回の課題にします)