批量提取db.get(keys)是否保留了键顺序?

时间:2009-02-23 11:47:24

标签: google-app-engine

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

我有兴趣弄清楚是否有任何保证结果列表保留了键的顺序(即键= [k_1k_2k_3]然后结果[r_1r_2r_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(结果的顺序总是得到保证)执行速度较慢
  4. 虽然结果似乎证实了我的假设,但我想知道其他人是否已对此进行了调查并得出了相似或不同的结论。

    TIA, ./alex

    进行更多研究我发现了以下内容({1}}和get_by_id的文档:

      

    如果id是一个列表,则该方法返回一个模型实例列表,当没有相应Key的实体时,该值为None值。

    即使它没有强调它,我认为很明显订单是有保证的。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

文件中的引文澄清了我的问题。