【问题标题】:Is there a way to specify a projection for ndb.get_multi()?有没有办法为 ndb.get_multi() 指定投影?
【发布时间】:2012-08-13 14:57:02
【问题描述】:

使用 NDB,可以为查询指定 projection,从而限制为匹配查询的实体检索的属性数量。

但是,我在文档中找不到任何关于在使用 ndb.get_multi() 时如何指定投影的内容,它总是获取完整的实体。

在使用ndb.get_multi() 时,有没有办法只获取某些属性?

【问题讨论】:

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


    【解决方案1】:

    不,投影功能仅适用于查询。投影 get() 操作没有优势(就更少的 I/O 操作而言)。

    【讨论】:

    • 感谢您的回答。您能否详细说明为什么投影对查询有帮助,但对获取操作没有帮助?
    • 在查询中,投影直接满足索引中的值,因此数据存储后端可以避免完全读取实际实体。这是一个巨大的胜利,因为它节省了真正的磁盘寻道。对于 get 操作,您所拥有的就是关键,因此您无法避免读取实际实体 - 您获得的唯一节省将是反序列化成本和一些带宽,这通常不会太多。
    【解决方案2】:

    我最终遇到了这样一种情况:使用 ndb.get_multi() 的投影确实可以提高性能。我有一个具有约 25 个属性的大型实体类,其中一些甚至是重复的。我需要 get_by_id 大约 10 个对象来为我的应用程序中的每个网页提供服务,但每个对象只需要 4 个属性。如果我使用普通的ndb.get_multi() 实现这一点,那么大约一半的前端 CPU 时间最终会花在一个名为 Model._from_pb 的 NDB API 方法中,即反序列化从数据库中读取的对象。这看起来可以通过投影来改进,实际上,在我使用投影的情况下,以下方式将整体响应时间缩短了一半:

    Product.query(Product.key.IN(keys_to_get)).fetch(projection=list_of_columns)
    

    Product 是我的实体类的名称。当然,在这种情况下,查询需要一个新索引。

    【讨论】:

    • 澄清一下,您是说您设法实现了上述功能,还是说这是一个可以从结合 get_multi 和投影查询中受益的用例?
    • 实际上,我想说这两个。我的程序中确实有一部分需要通过 ID 获取多个实体,但只有几个字段是有趣的。这是我的用例,它可以从将 get_multi 与投影相结合中受益。我想说的另一件事是,我实际上已经设法使用上面的代码 sn-p 模拟 get_multi() 和投影。它实际上在 GAE Python 2 中适用于我的用例,它实际上比使用 get_multi() 更快。
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2011-01-07
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多