SimpleDB:检查是否存在的高效查询



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

实际上并没有那么多选择。如果您要查找的属性不是项目名称,则唯一的替代方法是使用选择。有两种可能的方法。首次使用计数(*)

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

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

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

此外,还可以选择使用限制

select ..... limit 1

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

我的第一遍使用了一个匹配多个项目(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

我的第二次传递使用了仅匹配一个项目的谓词 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() 情况下产生数据传输的开销,尽管它会更便宜 BoxUse 明智。限制的使用不会对BoxUsage产生很大影响,这并不令人惊讶,因为它用于分页,这意味着您可以通过使用NextMarker重复查询来继续检索更多结果。

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

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

如果性能/成本敏感,则应在环境中自行执行测试。

相关内容

  • 没有找到相关文章

最新更新