【问题标题】:AppEngine NDB query and datastore_v3.Next()AppEngine NDB 查询和 datastore_v3.Next()
【发布时间】:2016-10-01 05:54:13
【问题描述】:

我有一些 AppEngine 操作花费的时间比预期的要长,所以我一直在查看 GAE 控制台上的跟踪日志以获得一些见解。

其中之一是对实体进行排序的简单查询,例如

(data, cursor, more) = query.order(-cls.created).fetch_page(RESULTS_PER_PAGE, start_cursor=cursor)

但是根据日志,如果我正确理解了跟踪(下面的屏幕截图),该操作会运行 2 个查询:一个是获取数据(RunQuery),一个是查找是否有更多数据(下一步)。两者都不会花费太多时间,但两者之间有 600 毫秒的延迟。

我想知道为什么这个延迟都太长了?我看到了一些关于 Next() 的问题,其中查询花费了更长的时间 (How do I prevent application calling datastore_v3.next() when calling get_multi?),但在我的情况下 Next() 的时间非常短。瓶颈似乎是两者之间的时间。这在很多情况下都会发生 - 前面的 NDB 查询只是一个示例。

所以:

  1. 我可以避免调用 Next() 或
  2. 我能否尽量减少 RunQuery 和 Next() 之间的延迟

我使用的是标准实例,除了入站预热之外,我的 app.yaml 文件中没有任何特定设置。

【问题讨论】:

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


    【解决方案1】:

    使用.fetch() 而不是.fetch_page() ...前者获取到一个限制并停止...它不返回任何关于是否有更多结果的信息

    【讨论】:

    • 是的,这也是我在单独对话中得到的建议——因为无法控制 RunQuery() 和 Next() 之间的延迟。但是,如果我需要知道何时有更多结果(因此使用 fetch_page())
    • 考虑使用查询迭代器...有一个特殊的probably_has_next() 调用,它使用一些快捷方式来提高效率,但我不是它的权威:cloud.google.com/appengine/docs/python/ndb/queries#iterators
    【解决方案2】:

    这只是推测,但我认为查询结果被分成多个块(.Next)的原因是因为每个块的大小。如果您可以减小实体的大小或使用Projection queries 缩小结果,您可能会看到更好的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2012-09-25
      • 1970-01-01
      相关资源
      最近更新 更多