SimpleDB:检查存在的高效查询

时间:2012-05-27 10:33:47

标签: amazon-simpledb

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

1 个答案:

答案 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

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