【问题标题】:GAE NDB performance of ComputedProperty versus on-demand lookup of related-model countComputedProperty 的 GAE NDB 性能与相关模型计数的按需查找
【发布时间】:2013-02-02 19:59:24
【问题描述】:

使用 Google App Engine,我很好奇是否有人可以阐明使用 ComputedProperty 与按需计算相关模型的计数的性能特征(读取和写入)。

ComputedProperty 具有允许对属性进行索引的明显优势,但我只是好奇读取和写入的速度相比有多快。

例如,给定两个模型:

class Car(ndb.Model):
  owner_key = ndb.KeyProperty(kind='Owner', indexed=True)

class Owner(ndb.Model)
   def cars_count(self):
       ndb.query(Car.owner_key == self.key).count()

   cars_count_prop = ndb.ComputedProperty(cars_count)

这个问题实际上分解成如下内容:

  1. 写Owner 有多慢,因为它有cars_count_prop?
  2. 阅读cars_count_prop 比阅读cars_count 快多少?

或者,换句话说:

  1. 读写各自的渐近计算复杂度 (big-O) 是多少?
  2. 平均案例计算复杂度是多少 - 对于Jay Leno 以外的人(即每个 Owner 的少量 Car 实例)?
  3. 读取和写入的等待有多少是计算复杂度,有多少是数据库/memcache 查找?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    每次更新所有者实体时,都会重新计算查询。那可不好。查询的复杂性不是问题。但如果你真的想知道,你必须对它进行基准测试。

    【讨论】:

    • 谢谢你,圭多。我会大胆猜测ComputedProperty 替代方案在很少写但经常阅读的情况下会更可取。
    • 即使在这些情况下,计算属性也不会为您节省任何东西——它仍然会在您每次请求其值时运行查询!使用计算属性的关键在于您想要索引计算值。但是这个例子不是一个很好的选择,因为每次将汽车添加到给定的所有者(或从给定的所有者移除)时,存储的值都会过时。您可以通过在所有者获得或处置汽车时向所有者添加读写周期来解决此问题,但是您也可以手动存储计数...
    • 哦,是的,我明白了。这正是the docs say,所以我应该注意到这一点。谢谢你的评论。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多