【问题标题】:Is batch fetching db.get(keys) preserving the keys order?批量获取 db.get(keys) 是否保留键顺序?
【发布时间】:2009-02-23 11:47:23
【问题描述】:

Google App Engine 支持基于键列表google.appengine.ext.db.get(keys) 的提取操作。

我很想知道是否可以保证结果列表保留键的顺序(即键 = [k_1, k_2, k_3] 然后为结果 [@987654325 @, r_2, r_3] 总是正确的 r_i.key() == k_i)。

据我所知,API 通过内部为 IN 中的每个值发出 N 个子选择来执行 IN 选择。我希望 db.keys 会发生这种情况,因此调用将保留键顺序。

无论如何,我不确定,我找不到任何参考表明db.keys 等同于 IN 选择,但如果没有对其执行进行任何优化。否则,解决方法将非常简单(我会迭代并查询自己的每个键,因此我可以保证我不依赖 db.keys 实现)。

我进行了一些基本测试,结果显示:

  1. db.get() 表现最佳
  2. db.get() 保留密钥顺序
  3. 替代品Model.get_by_id(始终保证结果顺序)执行速度较慢

虽然结果似乎证实了我的假设,但我想知道其他人是否对此进行了调查并得出了相似或不同的结论。

tia, ./亚历克斯

进行更多研究后,我发现了以下内容(db.get()Model.get() 的文档:

如果 ids 是一个列表,则该方法返回一个模型实例列表,当对应的 Key 不存在实体时,该方法返回 None 值。

即使不加下划线,我认为顺序是有保证的。

【问题讨论】:

  • 我怎样才能结束这个问题?我想我已经找到了答案。

标签: google-app-engine


【解决方案1】:

您是对的:db.get 以与您提供的键相同的顺序返回实体。您观察到的性能差异是因为它只需要对数据库进行一次往返而不是多次往返,并且因为它可以同时获取所有实体,而不是串行操作。但是,它不等同于“SELECT ... IN ...”,因为它基于 Bigtable,并且您在主键上进行选择,因此它可以直接在表上进行查找。

在进行性能比较时要牢记一件事:始终在生产服务器上进行,而不是在 dev_appserver 上。两者具有完全不同的性能特征。

【讨论】:

  • 我的简单性能测试是在生产服务器上进行的。
【解决方案2】:

文档中的引用澄清了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2010-10-14
    • 2017-03-04
    • 1970-01-01
    • 2014-06-12
    • 2021-03-04
    • 2016-02-12
    相关资源
    最近更新 更多