【问题标题】:Limit query results when counting entities计算实体时限制查询结果
【发布时间】:2015-02-10 09:56:07
【问题描述】:

我想要计算Employees 的数量,但我只想知道Employees 是否有50 个或更多。如果我执行Count-操作(见下文)并将Range 设置在0-> 51 之间,那么查询会最多计数到51,还是仍会计数所有Employees?我想知道这一点,以便查询不会在每次运行查询时计算所有 1000 名员工(对性能不利)。

Query query = pm.newQuery("SELECT count(p) FROM Employees p");
query.setRange(0, 51);
long count = (long) query.execute();
if(count >= skipThreshold)
{
   acceptedEmployees.add(mode);
}

谢谢!

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

    如果您执行SELECT count(p) FROM Employees p,则将返回一行具有一个值... COUNT,因为您要求计数。范围在该查询中毫无意义。当查询返回多行(对象)时使用范围。

    【讨论】:

    • 谢谢!所以你的意思是计数实际上会计算所有对象(意味着性能不佳)然后应用限制,在这种计数情况下什么都不做?
    • 一个 COUNT 查询将执行 SQL“COUNT(*)”,因此返回一个聚合,因此范围是没有意义的。请参阅 JDO 规范和任何不错的 JDO 文档
    • 好的,那我明白了!不确定 JDO/App Engine 中的 COUNT 查询是否以与普通 SQL 查询相同的方式实现!
    【解决方案2】:

    来自google documentation

    范围

    查询可以指定要返回给应用程序的结果范围。该范围指示完整结果集中的哪些结果应该是第一个和最后一个返回的结果。结果由它们的数字索引标识,0 表示集合中的第一个结果。例如,5、10 的范围返回第 6 到第 10 个结果:

    q.setRange(5, 10);
    

    【讨论】:

      【解决方案3】:

      了解您至少有 50 名员工的最佳方法是使用以下查询/计数语句。

      query = db.Query(Employee)
      if query.count(50) == 50 :
          # Means, you have at least 50 or more Employees in your Datastore
      

      编码愉快...

      【讨论】:

      • 我正在使用 Java 和 JDO,正如我的问题中的“标签”所见,这看起来不像 Java/JDO。此外,您在示例中执行的查询是仅键还是检索“整个”实体?
      • 您好,很抱歉,如果这不是您要找的答案。不太了解 JDO,我认为您可以在 JDO 中翻译这个原始查询。我有一个参考,并检查了 count(50) 是否会在达到限制后立即返回。所以没有完整的实体扫描。只需 50 步即可完成。
      • 不过,如果您只想计算实体,我认为这个查询很糟糕,因为“db.Query(Employee)”会获取实体中的所有字段,不是吗?所谓的仅键查询会更好(但是在 python 中会这样做)。 :)
      • 嗨,就像我说的。我提出的解决方案不会循环遍历完整的数据集。如果您只想在 Python 中使用键,那么我想这就是您要寻找的: q = db.Query(Player, keys_only=True) for result_key in q: # result_key is a Key...
      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多