0

使用 SimpleDB 查询项目是否存在的最有效方法是什么?例如,“是否有使用此邮政编码的用户”?

4

1 回答 1

2

真的没有那么多选择。如果您要查找的属性不是项目名称,您唯一的选择是使用选择。有两种可能的方法。首先使用 count(*)

select count(*) from DomainX where AttributeY='ZValue'

或者,如果您想在检查是否存在后检索该项目(尽管您可能只是select *在这种情况下),则使用 itemName() 可以带来更多好处。

select itemName() from DomainX where AttributeY='ZValue'

此外还有使用限制的选项

select ..... limit 1

幸运的是,亚马逊通过每个 SimpleDB 操作返回的 BoxUsage 值提供了最昂贵的提示。我编写了一个小脚本来运行 4 个备选方案中的每一个 25 次(考虑库预热)并比较每个备选方案的时间和 BoxUsage。使用的域包含大约 4500 个项目,每个项目有 4 个属性。

我的第一遍使用了一个谓词 where 子句,它匹配多个项目(11 个项目)。

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

我的第二遍使用了一个谓词 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 明智的做法会更便宜。限制的使用不会对 BoxUsage 产生很大影响并不令人惊讶,因为它用于分页,这意味着您可以通过使用 NextMarker 重复查询来继续检索更多结果。

如果我在 simpledb 之上实现通用Exists()操作,我可能会选择

select itemName() from X where Y='Z' limit 1

如果性能/成本很敏感,您应该在您的环境中自己执行这些测试。

于 2012-08-09T19:02:07.090 回答