在 appengine计费和预算资源页面中,它表示“查询”的成本映射到“1 读取 + 1 个小检索实体”,而“查询(仅限键)”映射到“1 读取 + 1 个小每检索到的密钥”。
这对我来说似乎是一个错字。看起来查询仍然需要对返回的每个实体执行完整的“获取”操作。这个假设不正确吗?我本来预计“查询”的成本是“每个检索到的实体1 次读取 + 1 次读取”。
在 appengine计费和预算资源页面中,它表示“查询”的成本映射到“1 读取 + 1 个小检索实体”,而“查询(仅限键)”映射到“1 读取 + 1 个小每检索到的密钥”。
这对我来说似乎是一个错字。看起来查询仍然需要对返回的每个实体执行完整的“获取”操作。这个假设不正确吗?我本来预计“查询”的成本是“每个检索到的实体1 次读取 + 1 次读取”。
嗯,这似乎很奇怪。我猜想只有键的查询只查看索引,而普通查询也会根据该键检索实体。
无论如何,这很容易测试:所有请求都已将成本添加到 log中。创建一个执行查询的请求和另一个具有相同的仅键查询的请求,然后比较成本。
正如彼得建议的那样,我刚刚针对常规查询测试了仅键查询。
这是常规查询:
def test_query():
q = Project.all()
q.run()
return 'Query test complete.'
和日志:
70.162.229.226 - - [02/Sep/2012:20:46:51 -0700] "GET /query HTTP/1.1" 200 124 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" "www.kicksaver.net" ms=28 cpu_ms=0 cpm_usd=0.000014 instance=00c61b117c79c7b82c3798e359e96ca71deb39
仅键查询:
def test_key_query():
q = Project.all()
q.run(keys_only=True)
return 'Keys only test complete.'
和日志:
70.162.229.226 - - [02/Sep/2012:20:46:56 -0700] "GET /keys_only HTTP/1.1" 200 128 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" "www.kicksaver.net" ms=29 cpu_ms=0 cpm_usd=0.000014 instance=00c61b117c79c7b82c3798e359e96ca71deb39
两者都返回cpm_usd=0.000014
。我测试了两个不同的应用程序,并使用了一些不同的批量大小和限制,并且这些cpm_usd
值始终相等或彼此相差在 0.000001 以内。看起来文档是正确的。
这绝对看起来像一个错字。cpm_usd 看起来像是一种已弃用的成本衡量方法,与之前的定价模型相关联。
使用最新版本的 AppStats ( Python SDK 1.7.1 ) 有一个工具可以计算数据存储相关的成本。使用交互式游乐场,我很快得到了这些结果:
使用 keys_only=False 查询
@1ms datastore_v3.RunQuery real=36ms api=0ms cost=770 billed_ops=[DATASTORE_READ:11]
与 keys_only=True 相同的查询
@1ms datastore_v3.RunQuery real=5ms api=0ms cost=170 billed_ops=[DATASTORE_READ:1, DATASTORE_SMALL:10]
(以小便士显示的所有成本(1 美元等于 100 便士,1 便士等于 100 万小便士))