使用SimpleDB查询项目是否存在的最有效方法是什么?例如,“是否有用户使用此邮政编码”?
答案 0 :(得分: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。使用的域包含大约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
如果性能/成本敏感,您应该在您的环境中自己进行测试。