使用 SimpleDB 查询项目是否存在的最有效方法是什么?例如,“是否有使用此邮政编码的用户”?
1 回答
真的没有那么多选择。如果您要查找的属性不是项目名称,您唯一的选择是使用选择。有两种可能的方法。首先使用 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
如果性能/成本很敏感,您应该在您的环境中自己执行这些测试。