SimpleDB を使用してアイテムの存在を照会する最も効率的な方法は何ですか? たとえば、「この郵便番号のユーザーはいますか」?
1 に答える
それほど多くの代替手段はありません。探している属性が項目名でない場合、唯一の選択肢は選択を使用することです。考えられるアプローチは 2 つあります。最初に count(*) を使用
select count(*) from DomainX where AttributeY='ZValue'
または、 itemName() を使用すると、存在を確認した後にアイテムを取得したい場合にさらに利点が得られます (ただし、おそらくselect *
その場合に限ります)。
select itemName() from DomainX where AttributeY='ZValue'
さらに、制限を使用するオプションがあります
select ..... limit 1
幸いなことに、Amazon は、SimpleDB の各操作によって返される BoxUsage 値を通じて、何が最も高価かについてのヒントを提供します。4 つの選択肢をそれぞれ 25 回 (ライブラリのウォームアップを考慮して) 実行し、それぞれのタイミングと BoxUsage を比較する小さなスクリプトを作成しました。使用されたドメインには、それぞれ 4 つの属性を持つ約 4500 のアイテムが含まれていました。
私の最初のパスは、いくつかの項目 (11 項目) に一致する単一の述語 where 句を使用しました。
Type of Query | Avg time(s) | Avg BoxUsage
------------------------------------------------------------
count(*) without limit | 0,092 | 0,0000229400
count(*) with limit 1 | 0,092 | 0,0000228616
itemName() without limit | 0,092 | 0,0000140880
itemName() with limit 1 | 0,090 | 0,0000140080
私の 2 番目のパスは、1 つの項目のみに一致する単一の述語 where 節を使用しました
Type of Query | Avg time(s) | Avg BoxUsage
------------------------------------------------------------
count(*) without limit | 0,090 | 0,0000140080
count(*) with limit 1 | 0,091 | 0,0000140080
itemName() without limit | 0,090 | 0,0000140080
itemName() with limit 1 | 0,093 | 0,0000140080
自宅の DSL からテストを実行したため、平均時間は統計的に有意ではなく、おそらくそれほど信頼できるものではありません。EC2 インスタンスからテストする方が適していたでしょう。
ただし、BoxUsage は興味深いものです。itemName() が count(*) よりも適していることを示唆していますが、クエリが多数のアイテム (数百) に一致するかどうかを考慮する必要があります。その場合、itemName でデータ転送のオーバーヘッドが発生します。 () ケースですが、BoxUsage のほうが安くなります。limit の使用が BoxUsage に大きな影響を与えないことはそれほど驚くべきことではありません。なぜなら、これはページングを意味するためであり、NextMarker を使用してクエリを繰り返すことで、より多くの結果を取得し続けることができるからです。
Exists()
simpledb の上に一般的な操作を実装する場所があれば、おそらく一緒に行くでしょう
select itemName() from X where Y='Z' limit 1
パフォーマンス/コストが重要な場合は、環境内でこれらのテストを自分で実行する必要があります。