【问题标题】:What is the most efficient way to get single result in Slick?在 Slick 中获得单一结果的最有效方法是什么?
【发布时间】:2016-10-19 16:45:19
【问题描述】:

不知道下面两行哪一行效率更高:

db.run(events (..filter/sort..) .take(1).result.head)

或

db.run(events (..filter/sort..) .result.head)

我发现 .take 来自 slick.lifted.Query

和 .head 来自 slick.profile.BasicStreamingAction

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    下面使用take(1) 的代码是高效的,因为take(1) 转换为生病的SQL,然后底层关系数据库的查询优化器进行优化,只选择结果的第一行。

    db.run(events (..filter/sort..) .take(1).result.head)
    

    但是在应用层只有.head 的情况下,slick 不会将该代码转换为 SQL,因此它不会与底层关系数据库通信。没有进行任何优化。当.head 在应用程序级别完成时,将从关系数据库返回的符合条件的行中选择一行。在应用层取第一行显然效率不高。

    .take(1) 将在 SQL 查询中转换为 LIMIT 1。

    .head 确实在应用层查询结果后给出了结果集的第一个元素(结果集可能非常庞大,而且效率非常低下而且非常慢)。

    .take(1) 只会在数据库级别给出一行。它非常高效,非常高效。

    【讨论】:

      【解决方案2】:

      您应该使用 headOption,因为使用 head 不是一个好习惯。如果结果为空,它可能会破坏您的代码。

      db.run(events (..filter/sort..) .take(1).result.headOption)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 2017-11-16
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        相关资源
        最近更新 更多