DynamoDB 用の PartiQL select ステートメント
Amazon DynamoDB では、SELECT ステートメントを使用して、テーブルからデータを取得します。
SELECT ステートメントを使用すると、パーティションキーを持つ等価条件または IN 条件が WHERE 句で指定されていない場合、完全なテーブルスキャンになることがあります。スキャンオペレーションは、すべての項目でリクエストされた値を調べるので、大きなテーブルまたはインデックスに対してプロビジョニングされたスループットを 1 回のオペレーションで使い果たすことがあります。
PartiQL で完全なテーブルスキャンを避けたい場合は、次のようにします。
-
完全なテーブルスキャンが行われないように、WHERE 句の条件を適切に設定していることを確かめながら、
SELECTステートメントを作成します。 -
DynamoDB デベロッパーガイドの 例: DynamoDB 用の PartiQL で ステートメントの選択を許可し、テーブル全体のスキャンを行うステートメントを拒否する に記載されているように、IAM ポリシーを使用して、完全なテーブルスキャンを無効にします。
詳細については、「DynamoDB デベロッパーガイド」の「データのクエリとスキャンのベストプラクティス」を参照してください。
構文
SELECTexpression[, ...] FROMtable[.index] [ WHEREcondition] [ [ORDER BYkey[DESC|ASC] , ...]
パラメータ
expression-
(必須)
*ワイルドカードからの射影、または結果セットからの 1 つ以上の属性名かドキュメントパスの射影リスト。式には、DynamoDB での PartiQL 関数の使用 への呼び出し、または DynamoDB での PartiQL 算術演算子、比較演算子、論理演算子 によって変更されたフィールドで構成できます。 %table-
(必須) クエリするテーブル名。
index-
(オプション) クエリを実行するインデックスの名前です。
注記
インデックスにクエリを実行するときは、テーブル名とインデックス名に二重引用符を追加する必要があります。
SELECT * FROM "TableName"."IndexName" condition-
(オプション) クエリの選択条件。
重要
SELECTステートメントによって、完全なテーブルスキャンが行われないようにするには、WHERE句の条件がパーティションキーを指定する必要があります。等価演算子または IN 演算子を使用します。例えば、
OrderIDパーティションキーと、Addressを含むその他の非キー属性があるOrdersテーブルがある場合、次のステートメントは完全なテーブルスキャンを実行しません。SELECT * FROM "Orders" WHERE OrderID = 100 SELECT * FROM "Orders" WHERE OrderID = 100 and Address='some address' SELECT * FROM "Orders" WHERE OrderID = 100 or OrderID = 200 SELECT * FROM "Orders" WHERE OrderID IN [100, 300, 234]ただし、次の
SELECTステートメントを実行すると、完全なテーブルスキャンが行われます。SELECT * FROM "Orders" WHERE OrderID > 1 SELECT * FROM "Orders" WHERE Address='some address' SELECT * FROM "Orders" WHERE OrderID = 100 OR Address='some address' キー-
(任意) 返ってきた結果の並び替えに使用するハッシュキーまたはソートキー。デフォルトの順序は昇順 (
ASC) です。返ってきた結果を降順に並べる場合は、DESCを指定します。
注記
WHERE 句を省略すると、テーブル内のすべての項目が取得されます。
例
次のクエリは、Orders テーブルでパーティションキーと OrderID を指定し、等価演算子を使用することで、存在する場合に項目を 1 つ返します。
SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1
次のクエリは、OR 演算子を使用することで、特定のパーティションキーと OrderID、値を持つ Orders テーブルから、すべての項目を返します。
SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1 OR OrderID = 2
次のクエリは、IN 演算子を使用することで、特定のパーティションキーと OrderID、値を持つ Orders テーブルから、すべての項目を返します。返ってきた結果は、OrderID キー属性の値によって、降順に並べられます。
SELECT OrderID, Total FROM "Orders" WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESC
次のクエリは、Total が非キー属性である場合に、Total が 500 以上である Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。
SELECT OrderID, Total FROM "Orders" WHERE Total > 500
次のクエリは、IN 演算子と非キー属性である Total を使用して、特定の Total 範囲の順序で、Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。
SELECT OrderID, Total FROM "Orders" WHERE Total IN [500, 600]
次のクエリは、BETWEEN 演算子と非キー属性である Total を使用して、特定の Total 範囲の順序で、Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。
SELECT OrderID, Total FROM "Orders" WHERE Total BETWEEN 500 AND 600
次のクエリは、WHERE 句の条件で CustomerID パーティションキーと MovieID ソートキーを指定し、SELECT 句でドキュメントのパスを使用することで、firestick デバイスで視聴を開始した最初の日付を返します。
SELECT Devices.FireStick.DateWatched[0] FROM WatchList WHERE CustomerID= 'C1' AND MovieID= 'M1'
次のクエリは、テーブル全体のスキャンを示しています。このスキャンでは、WHERE 句の条件でドキュメントのパスを使用し、2019 年 12 月 24 日以降に初めて firestick デバイスを使用した項目のリストを返します。
SELECT Devices FROM WatchList WHERE Devices.FireStick.DateWatched[0] >= '12/24/19'