4

NoSQL データベースの使用は初めてです。DynamoDB に 10 万を超えるアイテムを含むテーブルがあります。また、このテーブルは頻繁に更新されます。このテーブルでは、関係データベースの世界でこれと同様のことができるようにしたいと考えています。

Select * 
from tableName 
where attributeName = (Select MAX(attributeName) from tableName);

すべての行を Java コードにフェッチすることなく、これを行う安価な方法はありますか? 入力/ポインタをいただければ幸いです。ありがとう。

4

1 に答える 1

2

スペースや複雑さを追加せずにこれを行う安価な方法はありません。

高価な方法は、テーブル全体をスキャンしてキー属性と属性のみを取得しattributeName、最大値を計算してから、その最大値で見つかったすべての (完全な) 項目を取得することです。

テーブル内に複合キー (ハッシュと範囲) があり、相対的な合計項目数が少ない場合は、ローカル セカンダリ インデックスが役に立ち、わずかなスペースしか消費しません。属性にインデックスを作成し、attributeNameそのインデックスを使用して各ハッシュ キーに対してクエリを実行し、"isScanIndexForward:false" と "limit:1" を使用して、その hashKey から "max" を取得できます。次に、すべての結果の最大値 (各ハッシュキーから 1 つの結果) を計算すると、取得する値がわかります。それらはすべて、逆方向スキャンとattributeName.

複雑さを加えたい場合は、この情報を追加のテーブルに格納できます。のようなものtableName.extraInfoで、次のような項目があります: {hashKey: "maxOfAttributeName", "value":5}。次に、あなたputまたはupdateメインテーブルもこのフィールドを更新すると、ほら、あなたの価値があります。データが急速に変化する場合、このアプローチに伴うトランザクションの複雑さに注意してください。

于 2013-08-16T22:34:23.323 に答える