DynamoDB 用の PartiQL select ステートメント
Amazon DynamoDB では、SELECT
ステートメントを使用して、テーブルからデータを取得します。
SELECT
ステートメントを使用すると、パーティションキーを持つ等価条件または IN 条件が WHERE 句で指定されていない場合、完全なテーブルスキャンになることがあります。スキャンオペレーションは、すべての項目でリクエストされた値を調べるので、大きなテーブルまたはインデックスに対してプロビジョニングされたスループットを 1 回のオペレーションで使い果たすことがあります。
PartiQL で完全なテーブルスキャンを避けたい場合は、次のようにします。
-
完全なテーブルスキャンが行われないように、WHERE 句の条件を適切に設定していることを確かめながら、
SELECT
ステートメントを作成します。 -
DynamoDB デベロッパーガイドの 例: DynamoDB 用の PartiQL で ステートメントの選択を許可し、テーブル全体のスキャンを行うステートメントを拒否する に記載されているように、IAM ポリシーを使用して、完全なテーブルスキャンを無効にします。
詳細については、「DynamoDB デベロッパーガイド」の「データのクエリとスキャンのベストプラクティス」を参照してください。
構文
SELECT
expression
[, ...] 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 pk = 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'
key
-
(任意) 返ってきた結果の並び替えに使用するハッシュキーまたはソートキー。デフォルトの順序は昇順 (
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'